簡體   English   中英

CUDA,代碼可在一台GPU機器上運行,而不能在另一台GPU機器上運行

[英]CUDA, code works on one GPU machine, doesn't work on another

以下代碼段的行為令我感到困惑:

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

狄拉克(Dirac)在橫幅上提到了Fermi GPU。 如果您在具有Fermi GPU的節點上,則您的編譯命令不正確:

-arch=sm_30 

用於開普勒GPU。

嘗試:

-arch=sm_20

代替。

我對cuda-memcheck沒有報告任何錯誤感到困惑,但是您遇到的錯誤類型是cuda-memcheck不一定會捕獲的類型。 具體來說,有一類啟動失敗錯誤,只能通過@talonmies建議的正確cuda錯誤檢查來捕獲。 特別注意內核啟動后立即需要的錯誤檢查代碼。

當為-arch=sm_30編譯並嘗試在Fermi( sm_20 )計算機上運行時,內核啟動將立即失敗,但是所有其他后續CUDA API調用將報告沒有失敗。

Dirac詳細信息頁面確實提到了幾個開普勒節點/ GPU:

•1個節點:Tesla K20Xm

•1個節點:Tesla K40c

我相信您使用-arch=sm_35編譯的代碼應在這些節點上正確運行。

我還注意到,甚至還有一些較舊的(“ Tesla”系列)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擴展符號為所有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 ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM