2013-04-13 136 views

回答

16

总之,因为cudaMemcpy不能做同样的事情,cudaMemcpyToSymbol而无需额外的API调用。考虑一个常量存储阵列:

__constant__ float coeffs[8]; 

要使用cudaMemcpyToSymbol值复制到这个数组,只是做

cudaMemcpyToSymbol(coeffs, hostData, 8*sizeof(float)); 

为了做同样的cudaMemcpy需要这样的:

float *dcoeffs; 
cudaGetSymbolAddress((void **)&dcoeffs, coeffs); 
cudaMemcpy(dcoeffs, hostData, 8*sizeof(float), cudaMemcpyHostToDevice); 

直接调用到cudaMemcpy是非法的,没有先前的符号查找。

[标准免责声明:写在浏览器中无法获得的文档或编译器的所有代码,在风险自负]

+0

TY,什么是方法签名为const __constant__'内存和参数指针类型之间'的关系。 “__constant__”是否有指向const的指针,因为它是类型的?另外,为什么你不能只是采取&coeffs来获得地址? – rubixibuc

+2

'__constant__'是CUDA中的存储类说明符,表示该符号位于GPU DRAM的特殊高速缓存只读部分。它完全独立于const。你可以使用'&coeffs',因为这意味着主机内存中的符号*的地址*不是GPU内存,这是API调用的要求 – talonmies

+0

指针变量coeffs指向的地址在哪里?地址直接记忆?这是否也适用于用'__device__'声明的变量? – rubixibuc