這是我第一次嘗試CUDA程序。這是它應該做的:CUDA 1-D數組未更新
- 接收來自主機內存
- 每個像素由一個線程處理1D像素陣列:它是線程安全的,因爲只有「VAL」爲閱讀與「的newval」是更新。等待同步。
- 每個像素由一個線程處理:將「newval」複製到「val」。
- 將此數組寫回主機內存。
- 爲幾個不同的幀重複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;
}
我有一個懷疑,我的設備不正確地設置參數,否則我得到的特定設備的關鍵字錯誤的一個或忘記了關鍵的一步。有什麼東西會跳出來嗎?
您需要網格。 – Constantin 2013-05-09 01:22:47