我对以下代码段的行为感到困惑:
#include <stdio.h>
// kernel
__global__ void CheckAddressing(float * d_Result, int numCols, int numRows)
{
printf("%d\n", threadIdx.x);
if(threadIdx.x<16)
{
d_Result[threadIdx.x]=float(364.66);
}
}
////////
int main(int argc, char ** argv)
{
int TotalSize = 16;
float * d_Result;
float * h_Result;
cudaSetDevice(0);
h_Result = (float *)malloc(TotalSize*sizeof(float));
cudaMalloc((void **) &d_Result, TotalSize*sizeof(float));
CheckAddressing<<<dim3(1),dim3(16)>>>(d_Result, 8,8);
cudaMemcpy(h_Result, d_Result, TotalSize*sizeof(float), cudaMemcpyDeviceToHost);
for(int n=0; n<16; n++)
{
printf("%f\t", h_Result[n]);
}
printf("\n");
// free GPU memory
cudaFree(d_Result);
free(h_Result);
return 0;
}
它适用于一台机器(我用nvcc -arch=sm_30
编译)并返回364.66(16次)。但是在运行Cuda 5.5的另一台机器上,它返回全零。知道会发生什么吗?
更新:
cuda-memcheck ./test
========= CUDA-MEMCHECK
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
========= ERROR SUMMARY: 0 errors
nvidia-smi
Fri Apr 18 14:45:05 2014
+------------------------------------------------------+
| NVIDIA-SMI 331.44 Driver Version: 331.44 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K20Xm Off | 0000:02:00.0 Off | 0 |
| N/A 20C P0 50W / 235W | 11MiB / 5759MiB | 99% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Compute processes: GPU Memory |
| GPU PID Process name Usage |
|=============================================================================|
| No running compute processes found |
+-----------------------------------------------------------------------------+
答案 0 :(得分:1)
狄拉克在its banner上提到了费米GPU。如果您使用的是Fermi GPU节点,则编译命令不正确:
-arch=sm_30
用于Kepler GPU。
尝试:
-arch=sm_20
代替。
我对cuda-memcheck
没有报告任何错误这一事实感到困惑,但您遇到的错误类型是cuda-memcheck
不一定会捕获的类型。具体来说,有一类启动失败错误,只能被@talonmies建议的proper cuda error checking捕获。特别注意内核启动后立即需要的错误检查代码。
编译-arch=sm_30
并尝试在Fermi(sm_20
)计算机上运行时,内核启动将立即失败,但所有其他后续CUDA API调用都不会报告失败。
detail page for Dirac确实提到了几个Kepler节点/ GPU:
•1个节点:Tesla K20Xm
•1个节点:特斯拉K40c
我相信使用-arch=sm_35
编译的代码应该在这些节点上正确运行。
我还注意到甚至还有一些较旧的(&#34; Tesla&#34;系列)GPU /节点:
•4个节点:1个C1060 NVIDIA Tesla GPU,4GB内存和240个并行CUDA处理器内核。
•1个节点:4个C1060 Nvidia Tesla GPU,每个都有4GB内存和240个并行CUDA处理器内核。
对于这些节点,您需要编译:
-arch=sm_13
但是,如果您在使用CUDA代码时遇到困难,请不要忘记使用正确的cuda错误检查。
或者您可以使用nvcc extended notation为所有3种类型指定编译和二进制/可执行文件。
使用扩展表示法,对于该群集上的3种不同GPU架构(我可以看到):
nvcc -gencode arch=compute_13,code=sm_13 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_35,code=sm_35 ...