【发布时间】:2014-06-03 10:14:20
【问题描述】:
我对下面sn-p的行为感到困惑:
#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 |
+-----------------------------------------------------------------------------+
【问题讨论】:
-
最简单的找出方法是添加一些错误检查。每个 API 调用(和内核启动)都会返回或报告一个状态。检查这些将解释正在发生的事情。
-
我在运行代码时正在执行
cudamemcheck。检查错误是否足够?如果不是,获取错误报告的正确方法是什么? -
您在返回全零的机器上运行代码,而
cuda-memcheck报告零错误?你能显示你的实际调用和那台机器的实际输出吗? (将其粘贴到您的问题中)。机器配置和操作系统是什么? -
罗伯特,机器是狄拉克@Nersc。我以交互方式登陆其中一个节点 (nersc.gov/users/computational-systems/testbeds/dirac),编译代码,然后以相同的交互模式运行它。我也在联系 nersc 支持,但我认为我的代码可能有错误,看起来不像那样。如果我不在主机阵列上执行
malloc而只是执行float h_Result[16],则相同的代码会给出随机数