2017-09-27 60 views
0

我正在嘗試按照教程發現online。我正在使用Ubuntu 17,從命令行進行編譯。在CUDA中添加時返回不正確的數字

#include <stdio.h> 
#include <iostream> 

__global__ void add(int a, int b, int *c) 
{ 
    *c = a + b; 
} 

int main() 
{ 
    int a,b,c; 
    int *d_c; 
    int size = sizeof(int); 

    a = 2; 
    b = 7; 

    cudaMalloc((void **)&d_c,size; 
    add<<<1,1>>>(a,b,d_c); 
    cudaMemcpy(&c,d_c,size,cudaMemcpyHostToDevice); 
    std::cout << a << " + " << b << " = " << c << std::endl; 
    cudaFree(d_c); 

    return 0; 
} 

當我編譯nvcc我收到以下錯誤:

nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

我忽略了警告,跑a.out像往常一樣,和我得到的輸出:

2 + 7 = 1

上次我做數學,這是不正確的。我不確定我是否做得不正確,或者我所遵循的教程太舊了,或者與警告有關?任何幫助或線索都可以。我還會提到,我無法編譯nvcc,直到我安裝了gcc-5。我相信我已經使用我在這裏找到的these instructions正確地將它們連接在一起。

我也在這裏看過this solution。然而,我沒有找到答案特別有用,所以如果這是正確編譯,爲什麼不能正確地打印出我的終端,我將不勝感激。

任何幫助將不勝感激。

回答

2

您致電cudaMemcpy()不正確。您應該將設備(GPU)內存的結果複製到主機(CPU)內存,而不是其他方式。正確kind標誌使用的是cudaMemcpyDeviceToHost

cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost); 

爲了在將來簡化調試,想想實施proper CUDA API error checking以及系統地cuda-memcheckcuda-gdb,Valgrind的和鐺消毒劑運行您的程序。

+0

謝謝你的迴應。但是,我更新了我的代碼以使用'cudaMemcpyDeviceToHost',並且我仍然得到1的結果。讓我嘗試錯誤檢查,我在該線程上多次嘗試過一次高峯,但從未想過嘗試實現它。 – Sailanarmo

+0

剛剛發現我的錯誤,非常感謝你讓我錯誤檢查。 GPU Assert返回,'沒有檢測到CUDA功能的設備hello.cu 29'我會繼續研究爲什麼會發生這種情況。 – Sailanarmo

+0

你很快就實現了錯誤檢查。有時需要一段時間才能說服人們這樣做。因此,出現什麼樣的錯誤信息是:您的內核函數甚至沒有執行,因爲CUDA運行時無法找到支持CUDA的設備。確保你有最近的Nvidia卡(Fermi及以上版本,[其中之一](https://developer.nvidia.com/cuda-gpus),Compute Capability> = 2.0),[驅動程序已正確安裝] (http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html)。分類完成後,固定代碼應該可以工作。 – Drop