这是我最小的不工作测试用例。我在Stampede集群(其中CUDA /其他环境)自动设置上运行它,所以那里应该没有问题。
当我运行它时,输出主机b
数组永远不会改变(甚至不会从设备中复制)。我的输出为0.0
,0.0
- 显然应为100.0
,100.0
。
#include <cuda.h>
#include <stdio.h>
struct point {
double x,y;
};
__global__ void MyFunc(point* d_a) {
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);
cudaDeviceSynchronize();
MyFunc<<<1,1>>>(d_a);
cudaDeviceSynchronize();
point * b = (point*)malloc(sizeof(point));
cudaMemcpy(b,d_a,sizeof(point),cudaMemcpyDeviceToHost);
printf("%lf %lf\n",b->x,b->y);
cudaFree(d_a);
free(a);
free(b);
return 0;
}
使用以下代码编译CUDA 6.5.12:
nvcc -c -O3 -arch=compute_35 -code=sm_35 test.cu
可以在交互式终端会话(ibrun ./test
)上使用idev -n 1 -N 1
命令运行它。
运行期间未报告错误/段错误;它只是给错了输出。代码有问题,或者我只是错误地运行它?
答案 0 :(得分:0)
实际上,正如评论中所讨论的那样,GPU节点上的交互式环境(使用location.href = url
)未按预期工作。虽然我的问题本身并没有真正的“答案”,但我现在想出了一个解决方法。我欢迎那些看到这个问题的人尝试解释为什么我的原始设置不起作用。
编译代码不是问题,因为代码实际上是正确的,正如@pSoLT和后来我所证实的那样(除非您阅读注释:cuda错误检查代码现在也可以正常工作)。问题是交互式环境不允许您与计算节点上的加速器通信。解决问题:我没有以交互方式登录计算节点来运行CUDA代码,而是从默认登录节点提交了idev
脚本。像下面这样的东西对我有用:
sbatch