2013-02-05 24 views
0

调用时,下面的示例问题: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应该将其修改为指向新分配的设备内存的指针!

回答

3

指针未被修改,因为函数allocOnly中的cudaMalloc正在为参数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; 
    . 
    . 
    . 

} 
+0

这样的作品,非常感谢你的解释! –