嘿,
我有以下代码:
#if USE_CONST == 1
__constant__ double PNT[ SIZE ];
#else
__device__ double *PNT;
#endif
稍后我有:
#if USE_CONST == 0
cudaMalloc((void **)&PNT, sizeof(double)*SIZE);
cudaMemcpy(PNT, point, sizeof(double)*SIZE, cudaMemcpyHostToDevice);
#else
cudaMemcpyToSymbol(PNT, point, sizeof(double)*SIZE);
#endif
whereas point
是之前代码中定义的某个地方。当与USE_CONST=1
一切都按预期工作,但是如果没有它,则不会。我通过以下方式访问内核函数中的数组
PNT[ index ]
这两种变体之间的问题出在哪里?
谢谢!
CUDA 4.0之前的cudaMemcpyToSymbol的正确用法是:
cudaMemcpyToSymbol("PNT", point, sizeof(double)*SIZE)
或者:
double *cpnt;
cudaGetSymbolAddress((void **)&cpnt, "PNT");
cudaMemcpy(cpnt, point, sizeof(double)*SIZE, cudaMemcpyHostToDevice);
如果您计划多次从主机 API 访问符号,这可能会更快一些。
编辑:误解了这个问题。对于全局内存版本,执行与恒定内存的第二个版本类似的操作
double *gpnt;
cudaGetSymbolAddress((void **)&gpnt, "PNT");
cudaMemcpy(gpnt, point, sizeof(double)*SIZE. cudaMemcpyHostToDevice););
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)