【问题标题】:Copying struct data from host to device on CUDA using cudaMemcpy使用 cudaMemcpy 将结构数据从主机复制到 CUDA 上的设备
【发布时间】:2011-08-24 11:25:54
【问题描述】:

我在 CUDA 架构中将结构数据从主机复制到设备时遇到问题。
以下是代码sn-p。

struct point  
{  
     double x,y;  
};

int main()  
{  
   point * a = (point*)malloc(sizeof(point));  
   a->x=10.0;   
   a->y=10.0;    
   point * d_a;  
   cudaMalloc((void**)d_a,sizeof(point));  
   cudaMemcpy((void**)d_a,a,sizeof(point),cudaMemcpyHostToDevice);  
   dim3 dimblock(16,16);  
   dim3 dimgrid(1,1);  

   MyFunc<<<dimgrid,dimblock>>>(d_a);  
   cudaMemcpy((void**)a,d_a,sizeof(point),cudaMemcpyDeviceToHost);    
   printf("%lf %lf\n",a->x,a->y);
}  

__global__ void MyFunc(point* d_a)  
{  
     if(threadIdx.x == 0 && threadIdx.y == 0)
     {  
        d_a->x=100.0;  
        d_a->y = 100.0;    
     }
}  

a 点的 x 和 y 字段应该已更改为 100。相反,它仍然是初始化时的 10。这里发生了什么?请帮忙。

【问题讨论】:

    标签: struct cuda


    【解决方案1】:

    两个 cudaMemcpy() 调用的语法都不正确,它们应该是

    cudaMemcpy(d_a,a,sizeof(point),cudaMemcpyHostToDevice);
    

    cudaMemcpy(a,d_a,sizeof(point),cudaMemcpyDeviceToHost);    
    

    编辑:

    这个:

    #include <cstdio>
    #include <cstdlib>
    
    struct point  
    {  
         double x,y;  
    };
    
    __global__ void MyFunc(point* d_a)  
    {  
         if(threadIdx.x == 0 && threadIdx.y == 0)
         {  
            d_a->x=100.0;  
            d_a->y = 100.0;    
         }
    }  
    
    int main(void)  
    {  
       point * a = (point*)malloc(sizeof(point));  
       a->x=10.0;   
       a->y=10.0;    
       point * d_a;  
       cudaMalloc((void**)&d_a,sizeof(point));  
       cudaMemcpy(d_a,a,sizeof(point),cudaMemcpyHostToDevice);  
       dim3 dimblock(16,16);  
       dim3 dimgrid(1,1);  
    
       MyFunc<<<dimgrid,dimblock>>>(d_a);  
       cudaMemcpy(a,d_a,sizeof(point),cudaMemcpyDeviceToHost);    
       printf("%lf %lf\n",a->x,a->y);
    
       return cudaThreadExit();
    } 
    

    在 64 位 linux 上运行的 CUDA 3.2 完全符合预期:

    cuda:~$ nvcc -arch=sm_20 -o bungle bungle.cu 
    cuda:~$ ./bungle 
    100.000000 100.000000
    

    因此,如果您无法复制此内容,那么您的 CUDA 安装可能有问题。

    【讨论】:

    • 我运行了这个,我的终端仍然打印 10 两次!!我的 cuda 卡有问题吗?
    【解决方案2】:

    总结和扩展 Anycorn 和 talonmies 的答案:

    1. 在 malloc 中使用额外的 & 符号,例如 (void**)&amp;d_a
    2. 不要在 memcpy 中使用 (void**)
    3. 确保检查cudaGetLastError 的错误并返回值。
    4. 确保在末尾使用cudaFree 释放分配的资源
    5. cudaSetDevicecudaThreadExit 也不会受到伤害。

    请参阅reference manualprogamming guide 了解更多详情。

    【讨论】:

    • 感谢 LumpN,但我们尝试了所有这些仍然没有帮助!还有其他可能吗??
    【解决方案3】:

    检查您的 cuda 状态:

    cudaMalloc((void**)&d_a,sizeof(point));  
    

    【讨论】:

    • @Vikesh:注意d_a之前的附加&符号&amp;
    猜你喜欢
    • 2017-08-27
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2013-07-20
    • 1970-01-01
    • 2023-03-14
    • 2013-09-20
    相关资源
    最近更新 更多