2015-09-12 33 views
0

我正在Mac上使用opencl 1.2開發一個簡單的radix-2 FFT算法。我試圖用HD 5000個顯卡在我的筆記本電腦OpenCL clEnqueueNDRangeKernel循環中

我的主機代碼是這樣的:

gws=4; 
lws=1; 

for (cur_iter=0; cur_iter <= 2; cur_iter++){ 
    ret = clSetKernelArg(r2kernel, 3, sizeof(cl_int), (void *)&cur_iter); 
    printf("iter %d \n", cur_iter); 
    ret = clEnqueueNDRangeKernel(command_queue, r2kernel, 1, NULL, &gws, &lws, 0, NULL, &kernelDone); 
    // printf("ret %d \n", ret); 
    ret = clWaitForEvents(1, &kernelDone); 
    // printf("ret %d \n", ret); 
} 

CUR_ITER意味着FFT的當前階段。我的內核代碼是這樣的:

kernel void radix2(global float2 * x, global float2 * w,int iter, int cur_iter) 
{ 

int gid = get_global_id(0); // number of threads 

int butterflySize = 1 << (iter-cur_iter-1); 
int butterflyGrpDist = 1 << (iter-cur_iter); 
int butterflyGrpBase = (gid >> (iter-cur_iter-1))*(butterflyGrpDist); 
int butterflyGrpOffset = gid & (butterflySize-1); 

int a = butterflyGrpBase + butterflyGrpOffset; 
int b = a + butterflySize; 

printf("gid %d pass %d, %d, %d ,total iter %d \n", gid,cur_iter,a,b,iter); 


float2 u0 = x[a]; 

float2 u1 = x[b]; 

float2 tmp; 

DFT2(u0,u1,tmp); 

int waddr=butterflyGrpOffset<<cur_iter; 

float2 twiddle = w[waddr]; 

MUL(u1,twiddle,tmp); 



x[a] = u0; 

x[b] = u1; 

} 

我打印出內核中的gid和cur_iter。我期望在每次迭代中獲得4個內核(用於8點FFT)。但我得到的是這樣的

iter 0 
gid 0 pass 0, 0, 4 ,total iter 3 
gid 1 pass 0, 1, 5 ,total iter 3 
gid 2 pass 0, 2, 6 ,total iter 3 
gid 3 pass 0, 3, 7 ,total iter 3 
iter 1 
gid 0 pass 0, 0, 4 ,total iter 3 
gid 1 pass 0, 1, 5 ,total iter 3 
gid 2 pass 0, 2, 6 ,total iter 3 
gid 3 pass 0, 3, 7 ,total iter 3 
gid 0 pass 0, 0, 4 ,total iter 3 
gid 1 pass 0, 1, 5 ,total iter 3 
gid 2 pass 0, 2, 6 ,total iter 3 
gid 3 pass 0, 3, 7 ,total iter 3 
gid 0 pass 1, 0, 2 ,total iter 3 
gid 1 pass 1, 1, 3 ,total iter 3 
gid 2 pass 1, 4, 6 ,total iter 3 
gid 3 pass 1, 5, 7 ,total iter 3 
iter 2 
gid 0 pass 0, 0, 4 ,total iter 3 
gid 1 pass 0, 1, 5 ,total iter 3 
gid 2 pass 0, 2, 6 ,total iter 3 
gid 3 pass 0, 3, 7 ,total iter 3 
gid 0 pass 0, 0, 4 ,total iter 3 
gid 1 pass 0, 1, 5 ,total iter 3 
gid 2 pass 0, 2, 6 ,total iter 3 
gid 3 pass 0, 3, 7 ,total iter 3 
gid 0 pass 1, 0, 2 ,total iter 3 
gid 1 pass 1, 1, 3 ,total iter 3 
gid 2 pass 1, 4, 6 ,total iter 3 
gid 3 pass 1, 5, 7 ,total iter 3 
gid 0 pass 0, 0, 4 ,total iter 3 
gid 1 pass 0, 1, 5 ,total iter 3 
gid 2 pass 0, 2, 6 ,total iter 3 
gid 3 pass 0, 3, 7 ,total iter 3 
gid 0 pass 1, 0, 2 ,total iter 3 
gid 1 pass 1, 1, 3 ,total iter 3 
gid 2 pass 1, 4, 6 ,total iter 3 
gid 3 pass 1, 5, 7 ,total iter 3 
gid 0 pass 2, 0, 1 ,total iter 3 
gid 2 pass 2, 4, 5 ,total iter 3 
gid 3 pass 2, 6, 7 ,total iter 3 
gid 1 pass 2, 2, 3 ,total iter 3 

在每次迭代這意味着,在CUR_ITER傳遞給我的內核總是從零開始,並啓動內核的情況下,也是錯誤的,甚至它的值是2或3。我想知道爲什麼。任何形式的幫助將不勝感激!

回答

0

它看起來像的printf緩衝區得到重新輸出爲每次迭代(每次迭代中包含的是什麼一直在印刷前,再加上更多的整體。沒有辦法,你會得到相同的GID多次在如果你使用clFinish而不是clWaitForEvents它會改變什麼嗎?

+0

非常感謝你的答覆我的問題已經解決了,我用FFT比較了FFT結果並且它們匹配,我認爲我不應該使用在我的內核中打印函數,但是這引出了另一個問題:是否有我們可以監視內核中的變量?FYI,clFinish和clWaitForEvents都可以工作 – Jeff