我對cuda非常陌生。我在設備模擬模式下在我的ubuntu 10.04上使用cuda。 我寫代碼來計算陣列的平方這是繼:cuda編程問題
#include <stdio.h>
#include <cuda.h>
__global__ void square_array(float *a, int N)
{
int idx = blockIdx.x + threadIdx.x;
if (idx<=N)
a[idx] = a[idx] * a[idx];
}
int main(void)
{
float *a_h, *a_d;
const int N = 10;
size_t size = N * sizeof(float);
a_h = (float *)malloc(size);
cudaMalloc((void **) &a_d, size);
for (int i=0; i<N; i++) a_h[i] = (float)i;
cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
square_array <<< 1,10>>> (a_d, N);
cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
// Print results
for (int i=0; i<N; i++) printf(" %f\n", a_h[i]);
free(a_h);
cudaFree(a_d);
return 0;
}
當我運行這段代碼顯示它沒有問題它給我正確的輸出。
現在我的問題是,當我使用< < < 2,5 >>>或< < < 5,2 >>>結果是一樣的。 gpu上發生了什麼? 我的理解是我只用5個包含2個線程的塊啓動cuda內核。 任何人都可以解釋我如何處理這個或執行啓動(內核調用)?
現在我真正的問題是,當我打電話給內核< < < 1,10 >>>沒關係。它顯示了完美的結果。 但是當我打電話與< < < 1,5 >>內核結果如下:
0.000000
1.000000
4.000000
9.000000
16.000000
5.000000
6.000000
7.000000
8.000000
9.000000
類似地,當我減少或增加所述第二參數在內核調用它示出了用於例如不同的結果時,我改變它到< < 1,4 >>它顯示了以下結果:
0.000000
1.000000
4.000000
9.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
爲什麼這個結果會來嗎? 任何機構可以解釋內核啓動調用的工作嗎?
什麼是blockdim類型變量包含? 請幫我理解內核調用啓動和工作的概念嗎? 我搜索了編程指南,但他們沒有很好地解釋它。
您正在更改N(10,4,5)的值。那麼顯然只有前N個元素應該被更新。你覺得這是什麼讓人困惑?! – 2011-05-16 17:31:50