【问题标题】:Is there any way to determine whether a variable is on the device or in the host?有什么方法可以确定变量是在设备上还是在主机上?
【发布时间】:2014-08-11 16:45:23
【问题描述】:

考虑以下示例:

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

有什么方法可以确定变量是在设备上还是在主机上?

谢谢。

【问题讨论】:

标签: cuda gpu


【解决方案1】:

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

在主机上,对于指向动态分配区域的指针(例如您的h_vard_var),如果启用了Unified Virtual Addressing,您可以使用@987654322 确定指针是指向设备内存还是主机内存@runtime API 调用。

另外,假设您要管理n float 类型,您应该使用的大小参数不是n,而是n*sizeof(float)

【讨论】:

  • 再次感谢罗伯特(+1)!
【解决方案2】:

不清楚您要问什么,但是,如果您在主函数之外使用 __device__ 声明一个变量,它将用作变量类型限定符,并将该变量放入全局 GPU 内存中。

看起来您所做的是将主机上的变量 h_var 的内容复制到设备上的 d_var。如果您想在 GPU 进行一些计算后将内容复制回来,您可以执行以下操作:

cudaMemcpy(h_var, d_var, n, cudaMemcpyDeviceToHost);

变量 d_var 仍会在设备上,直到您使用以下方法释放它:

cudaFree(d_var);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2019-08-19
    • 2011-03-09
    • 1970-01-01
    • 2016-11-09
    • 2011-01-04
    • 2010-10-12
    相关资源
    最近更新 更多