使用cudaMemcpy将结构数据从主机复制到CUDA上的设备

Vik*_*esh 5 struct cuda

我在将结构数据从主机复制到CUDA体系结构中的设备时遇到问题。
以下是代码段。

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;    
     }
}  
Run Code Online (Sandbox Code Playgroud)

点a的x和y字段应已更改为100。相反,它在初始化时仍为10。这是怎么回事 请帮忙。

tal*_*ies 5

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

cudaMemcpy(d_a,a,sizeof(point),cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

cudaMemcpy(a,d_a,sizeof(point),cudaMemcpyDeviceToHost);    
Run Code Online (Sandbox Code Playgroud)

编辑:

这:

#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();
} 
Run Code Online (Sandbox Code Playgroud)

在 64 位 Linux 上运行的 CUDA 3.2 完全按照预期工作:

cuda:~$ nvcc -arch=sm_20 -o bungle bungle.cu 
cuda:~$ ./bungle 
100.000000 100.000000
Run Code Online (Sandbox Code Playgroud)

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

  • 我运行了这个,我的终端仍然打印 10 两次!!我的cuda卡有问题吗? (2认同)

Any*_*orn 1

检查你的cuda状态:

cudaMalloc((void**)&d_a,sizeof(point));  
Run Code Online (Sandbox Code Playgroud)