为什么我的基于OpenCL的排序算法的结果是错误的?
Why my results of sort algorithm based on OpenCL are wrong?
我写了一个基于OpenCL和C的奇偶排序算法,还有一个串行奇偶排序算法。但是当我尝试运行它们时(例如我随机生成了一个有2000个元素的数组)然后将它们与第224个元素进行比较时,我发现它们是不同的。但在小样本上,它们都是一样的。这是为什么?
由于某些原因,我需要隐藏我的 OpenCL 代码。抱歉
这是我的 OpenCL 代码。
__kernel void
odd_sort(__global int *array,
int len,
int array_size)
{
}
__kernel void
even_sort(__global int *array,
int len,
int array_size)
{
}
这里是串口程序
void serial()
{
int i, j, tmp;
bool sorted = false;
while(!sorted)
{
sorted = true;
// odd sort
for (i = 1; i < array_size - 1; i+=2)
if (array[i] > array[i+1])
{
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
sorted = false;
}
// even sort
for (j = 0; j < array_size - 1; j+=2)
if (array[j] > array[j+1])
{
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
sorted = false;
}
}
// print(array, array_size);
}
barrier 只是(本地)工作组中所有线程的同步点。但是你想对所有线程进行全局同步。您不能在内核中进行这样的全局同步;您必须将内核分成两部分并重复调用奇数和偶数内核。完成一个内核代表一个全局同步点。
在你的情况下它适用于小规模,即如果你只有一个工作组,因为这样局部大小等于全局大小并且屏障适用于所有可用线程。
我写了一个基于OpenCL和C的奇偶排序算法,还有一个串行奇偶排序算法。但是当我尝试运行它们时(例如我随机生成了一个有2000个元素的数组)然后将它们与第224个元素进行比较时,我发现它们是不同的。但在小样本上,它们都是一样的。这是为什么?
由于某些原因,我需要隐藏我的 OpenCL 代码。抱歉
这是我的 OpenCL 代码。
__kernel void
odd_sort(__global int *array,
int len,
int array_size)
{
}
__kernel void
even_sort(__global int *array,
int len,
int array_size)
{
}
这里是串口程序
void serial()
{
int i, j, tmp;
bool sorted = false;
while(!sorted)
{
sorted = true;
// odd sort
for (i = 1; i < array_size - 1; i+=2)
if (array[i] > array[i+1])
{
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
sorted = false;
}
// even sort
for (j = 0; j < array_size - 1; j+=2)
if (array[j] > array[j+1])
{
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
sorted = false;
}
}
// print(array, array_size);
}
barrier 只是(本地)工作组中所有线程的同步点。但是你想对所有线程进行全局同步。您不能在内核中进行这样的全局同步;您必须将内核分成两部分并重复调用奇数和偶数内核。完成一个内核代表一个全局同步点。
在你的情况下它适用于小规模,即如果你只有一个工作组,因为这样局部大小等于全局大小并且屏障适用于所有可用线程。