Struct 使用cudaMemcpy将结构数据从主机复制到CUDA上的设备
我在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));
下面是代码片段
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的答案:
(void**)和d_a
(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