我正在學習一些基本的CUDA編程。我正嘗試在主機上初始化一個數組,並使用host_a[i] = i
。這個數組由N = 128個整數組成。我正在啓動一個內核,每個塊有1個塊和128個線程,其中我想要在索引i
處整數整數。Cuda內核來計算一個數組中的整數的正方形
我的問題是:
我怎麼會知道內核是否被啓動或沒有?我可以在內核中使用
printf
嗎?預期的輸出爲我的計劃是整數的平方的空間分隔的列表 -
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]);
}
}
你的代碼沒有什麼問題,除了缺少[適當的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'。 –
好的,謝謝!我的Nsight現在說沒有找到與CUDA兼容的設備,但我可以在Mac OS X 10.10.2的「系統偏好設置」中看到CUDA。無論如何,這是另一個問題。感謝您指出錯誤檢查部分。 – xennygrimmato