首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCL clEnqueueNDRangeKernel in循环

OpenCL clEnqueueNDRangeKernel in循环
EN

Stack Overflow用户
提问于 2015-09-12 06:58:19
回答 1查看 297关注 0票数 0

我正在开发一个简单的基-2 FFT算法,使用OpenCL1.2在Mac上使用.我正试图在我的笔记本电脑中使用HD 5000图形。

我的主机代码如下:

代码语言:javascript
复制
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指的是快速傅立叶变换的当前阶段。我的内核代码如下:

代码语言:javascript
复制
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)。但我得到的是这样

代码语言:javascript
复制
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。我想知道为什么。任何形式的帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-12 15:05:15

看起来printf缓冲区正在为每次迭代获得重新输出(每个迭代包含之前打印的全部内容,加上更多内容)。你不可能在一次传球中多次得到相同的信息。如果您使用clFinish而不是clWaitForEvents,它会改变什么吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32536154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档