2013-05-09 62 views
0

這是我第一次嘗試CUDA程序。這是它應該做的:CUDA 1-D數組未更新

  1. 接收來自主機內存
  2. 每個像素由一個線程處理1D像素陣列:它是線程安全的,因爲只有「VAL」爲閱讀與「的newval」是更新。等待同步。
  3. 每個像素由一個線程處理:將「newval」複製到「val」。
  4. 將此數組寫回主機內存。
  5. 爲幾個不同的幀重複2-4。

但是,會發生什麼情況是,新陣列中只有約32000個變量中的幾個變量似乎具有體面的值;其餘的都是零。

爲了簡潔,我已經刪除了這些計算。

__global__ void kernel(Pixel *array, float dt) 
{ 
    const unsigned int tid = threadIdx.x; 
    Pixel *point = array + tid; 
    //DO A BUNCH OF CALCULATIONS ON PIXEL KIND OF LIKE THIS 
    point->newval = point->val + foo; 
} 

__global__ void copykernel(Pixel *array) 
{ 
    const unsigned int tid = threadIdx.x; 
    Pixel *point = array + tid; 
    //COPY THE NEWVALS OVER TO THE OLD VALS IN PREPARATION FOR THE NEXT FRAME 
    point->val = point->newval; 
} 

extern "C" bool runIt(const int argc, const char **argv, Pixel *inarray, Pixel **outarrays, int arraysize, int numframes, float dt) 
{ 
    int memsize = arraysize*sizeof(Pixel); 
    int i=0; 

    Pixel *array; 
    cudaMalloc((void **) &array, memsize); 
    cudaMemcpy(array, inarray, memsize, cudaMemcpyHostToDevice); 

    int numthreads = arraysize; 
    dim3 grid(1,1,1); 
    dim3 threads(numthreads,1,1); 

    for(i=0;i<numframes;i++) 
    { 
     kernel<<<grid, threads>>>((Pixel *) array, dt); 
     cudaThreadSynchronize(); 
     copykernel<<<grid, threads>>>((Pixel *) array); 
     cudaThreadSynchronize(); 
     cudaMemcpy(array, outarrays[i], memsize, cudaMemcpyDeviceToHost); 
    } 
    cudaFree(array); 
    return true; 
} 

我有一個懷疑,我的設備不正確地設置參數,否則我得到的特定設備的關鍵字錯誤的一個或忘記了關鍵的一步。有什麼東西會跳出來嗎?

+0

您需要網格。 – Constantin 2013-05-09 01:22:47

回答

1

我不認爲你可以運行那麼多線程,如果可以的話,它不是一個好主意。嘗試將線程數設置爲256(2D爲16x16),然後根據輸入大小選擇網格大小。

dim3 threads(256,1,1); 
dim3 grid(arraysize/threads.x,1,1); //Careful of integer division, this is just for example 

此外,您的第二個副本不正確。您需要切換arrayout_arrays

cudaMemcpy(outarrays[i], array, memsize, cudaMemcpyDeviceToHost); 
+0

D'oh。我應該抓住那個錯誤的cudaMemcpy ......當然,那是問題所在。謝謝。 現在,關於主題......它沒有給我一個這個數字的問題;你能解釋爲什麼這是一個問題嗎? 最後,我需要在運行第二個內核之前等待所有線程完成。我可以將它們合併,然後在兩者之間添加cudaThreadSynchronize? – 2013-05-09 01:33:37

+0

弗蘭克你應該肯定修復這些線索,讓我看看我能不能找到你的文章.... – Constantin 2013-05-09 01:34:26

+0

http://stackoverflow.com/questions/4391162/cuda-determining-threads-per-block-blocks -per-grid – Constantin 2013-05-09 01:35:12