Graphics OpenCL在数组中查找最小索引

Graphics OpenCL在数组中查找最小索引,graphics,opencl,gpu,jocl,Graphics,Opencl,Gpu,Jocl,我正在使用OpenCL(通过JOCL)在光线行进的一系列距离计算中寻找极小值。伪代码如下所示: Start with a point in 3d space. There are a number of functions to calculate distances to that point from various other points. These may be rather complex (transforms, csg etc). Calculate all

我正在使用OpenCL(通过JOCL)在光线行进的一系列距离计算中寻找极小值。伪代码如下所示:

Start with a point in 3d space.
There are a number of functions to calculate distances
    to that point from various other points. 
    These may be rather complex (transforms, csg etc).
Calculate all of the distances, perhaps into an array
Get the index of the minimum distance in the array..
Use that index to do up other stuff (pigmentation etc).
但我的实现有点糟糕。我目前不并行计算距离,但我想。以下是我不这么做的原因:

获取最小距离很容易,但检索此索引并不明显。我最终迭代了这些距离并跟踪了当前的最小值及其索引,但在并行环境中这显然是垃圾

基本上可以用一个提示来引导我朝着正确的方向走,或者告诉我我是不是完全找错了方向?(例如,这是CPU作业吗?)


谢谢

使用RX550测试,RX550是一种低端图形卡

100万元素最小值()函数:

__kernel void test(__global float * data,__global int * index)
{
    int id=get_global_id(0);
    float d1=data[id];
    float d2=data[id+get_global_size(0)];
    float f=fmin(d1,d2);
    index[id]=select( index[id+get_global_size(0)], index[id], fabs(f-d1)<=fabs(f-d2) );
    data[id]=f;
}");
\uuuuu内核无效测试(\uuuu全局浮点*数据,\uuuuu全局整数*索引)
{
int id=获取全局id(0);
浮点d1=数据[id];
float d2=数据[id+获取全局大小(0)];
浮点数f=fmin(d1,d2);

索引[id]=选择(索引[id+get_global_size(0)],索引[id],晶圆厂(f-d1)使用RX550测试,RX550是一种低端图形卡

100万元素最小值()函数:

__kernel void test(__global float * data,__global int * index)
{
    int id=get_global_id(0);
    float d1=data[id];
    float d2=data[id+get_global_size(0)];
    float f=fmin(d1,d2);
    index[id]=select( index[id+get_global_size(0)], index[id], fabs(f-d1)<=fabs(f-d2) );
    data[id]=f;
}");
\uuuuu内核无效测试(\uuuu全局浮点*数据,\uuuuu全局整数*索引)
{
int id=获取全局id(0);
浮点d1=数据[id];
float d2=数据[id+获取全局大小(0)];
浮点数f=fmin(d1,d2);

索引[id]=选择(索引[id+获取全局大小(0)],索引[id],晶圆厂(f-d1)线程1可以比较两对之间的距离。线程2可以对另外两对执行相同的操作。然后,在两个线程之间进行同步后,单个线程可以检查两个结果之间的距离,并选择最小-最大值。现在,如果大小为N,则同步数可以为LogN,第一步中的最大线程数可以为N/4。这似乎是一种减少。如果有N/4核,只需要LogN同步点迭代伪周期。但如果数组未排序,则可能需要强制O(n^2)检查,因此需要n*Log(n)N/4核上的伪环system@huseyintugrulbuyukisik谢谢,我会尝试一下。这是一个减少,所以不需要排序。只需选择最小值及其索引。谢谢!可能可以调整一个简单的“减少”内核(如在)不执行<代码> +/<代码>还原,但<代码> min <代码>还原,不返回值,但索引。你考虑过这样的事吗?(我会尝试,但我现在没有时间)线程1可以比较两对之间的距离。线程2可以对另外两对执行相同的操作。然后,在两个线程之间进行同步后,单个线程可以检查两个结果之间的距离,并选择最小-最大值。现在,如果大小为N,则同步数可以为LogN,第一步中的最大线程数可以为N/4。这似乎是一种减少。如果有N/4核,只需要LogN同步点迭代伪周期。但如果数组未排序,则可能需要强制O(n^2)检查,因此需要n*Log(n)N/4核上的伪环system@huseyintugrulbuyukisik谢谢,我会尝试一下。这是一个减少,所以不需要排序。只需选择最小值及其索引。谢谢!可能可以调整一个简单的“减少”内核(如在)不执行<代码> +/<代码>还原,但<代码> min <代码>还原,不返回值,但索引。你考虑过这样的事吗?(我会尝试,但我现在没有时间)