cudaMalloc не изменяет указатель возврата при вызове внутри функции шаблона

Следующая проблема:

#include <iostream>

using namespace std;
__device__ __constant__ float* data;

template<class T> void allocOnly(T* deviceDest, size_t numElem)
{
cudaError_t errCode = cudaMalloc((void**)&deviceDest, numElem*sizeof(T));
if(errCode != cudaSuccess)
cout << "Got error with code " << errCode << endl;
}

int main()
{
float* test(0);
allocOnly<float>(test,10);
cout << "test = " << test << endl;

float* test2(0);
cudaError_t errCode = cudaMalloc((void**)&test2, 10*sizeof(float));
if(errCode != cudaSuccess)
cout << "Got error with code " << errCode << endl;
cout << "test2 = " << test2 << endl;

return 0;
}

составлено с nvcc test.cu -o testBin

возвращается

test = 0
test2 = 0x310100

Почему тест не изменяется при вызове через шаблонную функцию, cudaMalloc должен модифицировать его, чтобы он указывал на недавно выделенную память устройства!

0

Решение

Указатель не изменяется, потому что cudaMalloc в функции allocOnly выделяет память для аргумента deviceTest который является локальным для функции allocOnly, Вы можете изменить функцию allocOnly выделить память следующим образом:

template<class T> void allocOnly(T** deviceDest, size_t numElem)
{
cudaError_t errCode = cudaMalloc((void**)deviceDest, numElem*sizeof(T));
if(errCode != cudaSuccess)
cout << "Got error with code " << errCode << endl;
}

Внутри основной функции:

int main()
{
float* test(0);
allocOnly<float>(&test,10);
cout << "test = " << test << endl;
.
.
.

}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]