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之后则正常。