CUDA 基本结构测试不起作用
CUDA basic struct test not working
这是我最小的不工作测试用例。我 运行 在 Stampede 集群(其中 CUDA/the 环境的其余部分)自动设置,所以那里应该没有问题。
当我 运行 它时,输出主机 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
运行 可以在交互式终端会话 (idev -n 1 -N 1
) 上使用 ibrun ./test
命令来完成。
在运行期间没有报告errors/segfaults;它只是给出了错误的输出。是代码有问题,还是我只是 运行 设置不正确?
确实,正如评论中所讨论的那样,GPU 节点上的交互环境(使用 idev
)没有按预期工作。虽然我的问题本身没有真正的 "answer",但我现在已经找到了解决方法。我欢迎看到这个问题的其他人尝试解释为什么我的原始设置不起作用。
编译代码不是问题,因为代码实际上是正确的,正如@pSoLT 和后来我所确认的(除了你阅读评论:cuda 错误检查代码现在也可以工作)。问题是交互式环境不允许您与计算节点上的加速器通信。要解决此问题:我没有以交互方式登录到计算节点以 运行 CUDA 代码,而是从默认登录节点提交了 sbatch
脚本。像下面这样的东西对我有用:
#!/bin/bash
#SBATCH -A XXXXXXX
#SBATCH -J testRun
#SBTACH -o output/testOutput
#SBATCH -n 1
#SBATCH -p projectName
#SBATCH -t 00:01:00
ibrun ./test
这是我最小的不工作测试用例。我 运行 在 Stampede 集群(其中 CUDA/the 环境的其余部分)自动设置,所以那里应该没有问题。
当我 运行 它时,输出主机 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
运行 可以在交互式终端会话 (idev -n 1 -N 1
) 上使用 ibrun ./test
命令来完成。
在运行期间没有报告errors/segfaults;它只是给出了错误的输出。是代码有问题,还是我只是 运行 设置不正确?
确实,正如评论中所讨论的那样,GPU 节点上的交互环境(使用 idev
)没有按预期工作。虽然我的问题本身没有真正的 "answer",但我现在已经找到了解决方法。我欢迎看到这个问题的其他人尝试解释为什么我的原始设置不起作用。
编译代码不是问题,因为代码实际上是正确的,正如@pSoLT 和后来我所确认的(除了你阅读评论:cuda 错误检查代码现在也可以工作)。问题是交互式环境不允许您与计算节点上的加速器通信。要解决此问题:我没有以交互方式登录到计算节点以 运行 CUDA 代码,而是从默认登录节点提交了 sbatch
脚本。像下面这样的东西对我有用:
#!/bin/bash
#SBATCH -A XXXXXXX
#SBATCH -J testRun
#SBTACH -o output/testOutput
#SBATCH -n 1
#SBATCH -p projectName
#SBATCH -t 00:01:00
ibrun ./test