code:
#include <cstdio>
#define nn (10)
__device__ float a[nn];
__global__ void kernel(float *out)
{
if (threadIdx.x < nn)
out[threadIdx.x] = a[threadIdx.x];
}
int main()
{
const size_t sz = size_t(nn) * sizeof(float);
const float avals[nn]={ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10. };
float ah[nn];
//cudaMemcpyToSymbol('a', &avals[0], sz, size_t(0),cudaMemcpyHostToDevice);//错误,无法将avals中的数据copy到a
cudaMemcpyToSymbol(a, &avals[0], sz, size_t(0),cudaMemcpyHostToDevice);
float *ad;
cudaMalloc((void **)&ad, sz);
kernel<<<dim3(1),dim3(16)>>>(ad);
cudaMemcpy(&ah[0],ad,sz,cudaMemcpyDeviceToHost);
for(int i=0; i<nn; i++) {
printf("%d %f\n", i, ah[i]);
}
return 0;
}注意:
cudaMemcpyToSymbol()的第一个参数如何写,貌似跟cuda的版本有关,我在google上找到的一段代码,用的是‘a’,然而,在我的机器上无法实现数据拷贝,改为a之后则正常。
本文详细解析了CUDA编程中使用cudaMemcpyToSymbol进行数据拷贝的问题及解决方案,涉及设备内存与主机内存之间的数据传输。通过实例代码演示了正确的方法,并解释了错误原因。
362

被折叠的 条评论
为什么被折叠?



