有没有办法确定变量是在设备上还是在主机中?

时间:2013-12-14 17:42:34

标签: cuda gpu

考虑以下示例:

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));

有没有办法确定变量是在设备上还是在主机中?

谢谢。

2 个答案:

答案 0 :(得分:2)

在设备上,您可以访问的唯一指针是设备指针。

在主机上,指向动态分配的区域(例如h_vard_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);