2015-12-06 52 views
0

我正在學習一些基本的CUDA編程。我正嘗試在主機上初始化一個數組,並使用host_a[i] = i。這個數組由N = 128個整數組成。我正在啓動一個內核,每個塊有1個塊和128個線程,其中我想要在索引i處整數整數。Cuda內核來計算一個數組中的整數的正方形

我的問題是:

  1. 我怎麼會知道內核是否被啓動或沒有?我可以在內核中使用printf嗎?

  2. 預期的輸出爲我的計劃是整數的平方的空間分隔的列表 -

1 4 9 16 ...

有什麼錯我的代碼,因爲它輸出1 2 3 4 5 ...

代碼:

#include <iostream> 
#include <numeric> 
#include <stdlib.h> 
#include <cuda.h> 

const int N = 128; 

__global__ void f(int *dev_a) { 
    unsigned int tid = threadIdx.x; 

    if(tid < N) { 
     dev_a[tid] = tid * tid; 
    } 
} 

int main(void) { 

    int host_a[N]; 
    int *dev_a; 
    cudaMalloc((void**)&dev_a, N * sizeof(int)); 
    for(int i = 0 ; i < N ; i++) { 
     host_a[i] = i; 
    } 
    cudaMemcpy(dev_a, host_a, N * sizeof(int), cudaMemcpyHostToDevice); 
    f<<<1, N>>>(dev_a); 

    cudaMemcpy(host_a, dev_a, N * sizeof(int), cudaMemcpyDeviceToHost); 

    for(int i = 0 ; i < N ; i++) { 
     printf("%d ", host_a[i]); 
    } 
} 
+2

你的代碼沒有什麼問題,除了缺少[適當的cuda錯誤檢查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-使用最CUDA的運行時API)。當我運行你的代碼時,它打印出0 1 4 9 16 25 ...所以我相信你的CUDA設置有問題,並且適當的cuda錯誤檢查可以幫助識別問題。你也可以用'cuda-memcheck'運行你的代碼,這可能讓你知道問題是什麼。如果您使用的是CUDA 7或CUDA 7.5支持的最新GPU,則可以在內核中使用'printf'。 –

+0

好的,謝謝!我的Nsight現在說沒有找到與CUDA兼容的設備,但我可以在Mac OS X 10.10.2的「系統偏好設置」中看到CUDA。無論如何,這是另一個問題。感謝您指出錯誤檢查部分。 – xennygrimmato

回答

1

我怎麼會知道內核是否被啓動或沒有?我可以在內核中使用printf嗎?

您可以使用在設備代碼printf(只要你#include <stdio.h>)上的任何計算能力2.0或更高版本的GPU。由於CUDA 7和CUDA 7.5僅支持這些類型的GPU,如果您使用的是CUDA 7或CUDA 7.5(成功),則可以在設備代碼中使用printf

我的代碼有什麼問題?

正如註釋中所述,如果在正確設置的機器上運行,代碼沒有任何「錯誤」。爲了解決你以前的問題「我如何知道內核是否啓動?」,我認爲最好的方法是使用proper cuda error checking,除了告訴你內核是否啓動之外,它還有很多好處。在這種情況下,它也會給出線索,說明您的計算機上的CUDA設置不正確。您還可以使用cuda-memcheck運行CUDA代碼作爲快速測試,以確定是否發生任何運行時錯誤。

+0

在我的代碼中添加錯誤檢查幫助我識別錯誤。 安裝的CUDA運行時版本不支持我的CUDA SDK版本。降級到CUDA 6.5使該程序爲我運行。 – xennygrimmato