如何在内核端OpenCL中编写嵌套循环

时间:2016-04-05 15:54:17

标签: opencl

我是OpenCL的初学者。我正在尝试实现opencl应用程序。我怀疑如何编写c 内核代码。我已经提供了原始的opencl代码。

  

问题: - 帮助我将给定的c代码更改为int i, j; // initialization of indexes for (i = 0; i<n; i++) Index[i] = i; // Bubble sort for (i = 0; i<n - 1; i++) { for (j = i + 1; j<n; j++) { if (I[i] > I[j]) { double z = I[i]; // exchange attractiveness I[i] = I[j]; I[j] = z; z = f[i]; // exchange fitness f[i] = f[j]; f[j] = z; int k = Index[i]; // exchange indexes Index[i] = Index[j]; Index[j] = k; } } } 内核代码?。

原始C代码:

template< class Function >
class foobar {
    Function f;
public:
    foobar(Function _f) : f(_f) {}

};

1 个答案:

答案 0 :(得分:1)

4096个元素数组的示例(备用bubble1和bubble2至少2048次---> 4096(N)个内核执行):

主机端的索引init,因为它刚刚分配。 辅助功能:

void swap2p(__private int * I,int i,int j)
{
        int tmp=I[i];
        I[i]=I[j];
        I[j]=tmp;
}
void swap2g(__global int * I,int i,int j)
{
        int tmp=I[i];
        I[i]=I[j];
        I[j]=tmp;
}

交替内核-1:

__kernel void bubble1(__global int * I, __global int * f, __global int * Index){
       int threadId=get_global_id(0);
       __private int vals[2];

       if(threadId*2+1<4096)
       { 
              vals[0]=I[threadId*2];
              vals[1]=I[threadId*2+1];
              if(vals[0]>vals[1])
              {      
                    swap2p(vals,threadId*2,threadId*2+1);
                    swap2g(f,threadId*2,threadId*2+1);
                    swap2g(Index,threadId*2,threadId*2+1);
                    I[threadId*2]=vals[0];
                    I[threadId*2+1]=vals[1];
              }
       }
}

交替使用kernel-2:

__kernel void bubble2(__global int * I){
       int threadId=get_global_id(0);
       __private int vals[2];

       if(threadId*2+2<4096)
       {
              vals[0]=I[threadId*2+1];
              vals[1]=I[threadId*2+2];
              if(vals[0]>vals[1])
              {      
                    swap2p(vals,threadId*2+1,threadId*2+2);
                    swap2g(f,threadId*2+1,threadId*2+2);
                    swap2g(Index,threadId*2+1,threadId*2+2);
                    I[threadId*2+1]=vals[0];
                    I[threadId*2+2]=vals[1];
              }
       }
}

全球主题编号:N / 2(2048)