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

Struct 使用cudaMemcpy将结构数据从主机复制到CUDA上的设备,struct,cuda,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));

我在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;    
     }
}  
结构点
{  
双x,y;
};
int main()
{  
点*a=(点*)malloc(sizeof(点));
a->x=10.0;
a->y=10.0;
点*d_a;
Cudamaloc((void**)d_a,sizeof(point));
cudaMemcpy((void**)d_a,a,sizeof(point),cudaMemcpyHostToDevice);
dim3 dimblock(16,16);
dim3 dimgrid(1,1);
MyFunc(d_a);
cudaMemcpy((void**)a、d_a、sizeof(point)、cudamemcpydevicetoost);
printf(“%lf%lf\n”,a->x,a->y);
}  
__全局无效MyFunc(点*d\u a)
{  
if(threadIdx.x==0&&threadIdx.y==0)
{  
d_a->x=100.0;
d_a->y=100.0;
}
}  

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

检查您的cuda状态:

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

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

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

编辑:

这:


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

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

  • 在malloc中使用额外的符号,如
    (void**)和d_a
  • 不要在memcpy中使用
    (void**)
  • 确保使用
    cudaGetLastError
    和返回值检查错误
  • 确保使用
    cudaFree
  • 而且
    cudaSetDevice
    cudaThreadExit
    不会造成伤害

  • 有关更多详细信息,请参见和。

    @Vikesh:请注意
    d_a
    之前的附加符号和
    &
    !谢谢LumpN,但我们尝试了所有这些,但仍然没有帮助!!还有其他可能吗?我运行了这个,我的终端仍在打印10两次!!我的cuda卡有问题吗?
    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();
    } 
    
    cuda:~$ nvcc -arch=sm_20 -o bungle bungle.cu 
    cuda:~$ ./bungle 
    100.000000 100.000000