CUDA,代码适用于一台GPU机器,不适用于另一台GPU机器

时间:2014-04-18 20:40:42

标签: c cuda gpu gpgpu

我对以下代码段的行为感到困惑:

 #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                                         |
+-----------------------------------------------------------------------------+

1 个答案:

答案 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 ...