考虑以下示例:
float *h_var= new float[n*sizeof(float)]; // host
//Assign data
for(int i = 0; i < n; i++)
h_var[i] = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);;
float *d_var; //device
checkCudaErrors(cudaMalloc( &d_var, n));
checkCudaErrors(cudaMemcpy(d_var, h_var, n, cudaMemcpyHostToDevice));
有没有办法确定变量是在设备上还是在主机中?
谢谢。
答案 0 :(得分:2)
在设备上,您可以访问的唯一指针是设备指针。
在主机上,指向动态分配的区域(例如h_var
和d_var
),如果启用了Unified Virtual Addressing,则可以确定指针是指向设备还是使用cudaPointerGetAttributes运行时API调用来托管内存。
此外,假设您要管理n
float
类型,您应该使用的尺码参数不是n
,而是n*sizeof(float)
答案 1 :(得分:0)
不清楚你在问什么,但是,如果你在主函数之外声明一个__device__
的变量,它将被用作变量类型限定符,并将该变量放在全局GPU内存中。
您所做的就是将主机上变量h_var的内容复制到设备上的d_var。如果要在GPU执行某些计算后将内容复制回来,可以执行以下操作:
cudaMemcpy(h_var, d_var, n, cudaMemcpyDeviceToHost);
变量d_var仍将在设备上,直到您使用以下命令解除分配:
cudaFree(d_var);