我是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) {}
};
答案 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)