Algorithm GPU中的对象聚类

Algorithm GPU中的对象聚类,algorithm,webgl,Algorithm,Webgl,我的算法对于聚类很简单,它是这样的 第一个对象由所有其他对象分组,这些对象之间的距离小于X。 然后我们转到第二个对象,如果不包括在第一组中,我们对不包括在第一组中的其他对象运行相同的算法, 等等 我正试图在GPU中使用片段着色器进行此算法。 首先,我将所有位置设置为RGBA浮动纹理。设置每个像素的位置x,y-z和w现在是自由的。然后我使用着色器将计算结果绘制到结果纹理。最后,我将读取结果纹理的像素并执行代码 我尝试了许多不同的代码,并且在执行我的算法时使用了多阶段绘图,但我对时间性能不满意 问题

我的算法对于聚类很简单,它是这样的

第一个对象由所有其他对象分组,这些对象之间的距离小于X。 然后我们转到第二个对象,如果不包括在第一组中,我们对不包括在第一组中的其他对象运行相同的算法, 等等

我正试图在GPU中使用片段着色器进行此算法。 首先,我将所有位置设置为RGBA浮动纹理。设置每个像素的位置x,y-z和w现在是自由的。然后我使用着色器将计算结果绘制到结果纹理。最后,我将读取结果纹理的像素并执行代码

我尝试了许多不同的代码,并且在执行我的算法时使用了多阶段绘图,但我对时间性能不满意

问题是,, 有没有办法在纹理上运行一次以执行我的愿望单绘制阶段

我最新的尝试是这个算法-我的片段着色器

precision highp float;

uniform sampler2D locs;
varying vec2 coord;
uniform float clusterDistance;
const float textureSize = 64.;

void main()
{
    // Getting my location
    vec4 currData = texture2D(locs, coord);
    float offsetPix = 1./textureSize/2.;
    vec2 coordIdx = (coord - offsetPix) * textureSize;
    // Getting the index of my location
    float myIdx = coordIdx.y * textureSize + coordIdx.x;
    int clusterIdx = 0;
    float clusterNum = 0.;
    // Running over all the other locations until me and finding the first close object to me
    for (float i=0.;i<textureSize*textureSize;++i)
    {
        clusterNum = i +1.;
        // Which mean that we didn't find any closed object to me so we stop
        if (i == myIdx)
        {
            break;
        } 
        else
        {
            vec2 pntLoc = vec2(mod(i, textureSize), floor(i/textureSize)) / textureSize+offsetPix;
            vec4 pnt = texture2D(locs, pntLoc);
            if (distance(currData.xy, pnt.xy) <= clusterDistance) 
            {
                break;
            }
        }
    }

    // Print the result
    gl_FragColor = vec4(currData.x, currData.y, clusterNum, 1.);
}
但这里的问题是,结果可能导致链式聚类。例如。 如果我们的数据是{0,0},{4,0},{8,0},那么到组的最大距离是4。然后第一个接近第二个。然后第三个接近第二个,但不是第一个。根据我的算法,它返回第二个对象的索引,尽管第二个对象不在图片中,因为它由第一个对象分组,而第一个对象是距离的参考对象

在写入结果纹理时是否可以从其读取


这将解决我的问题,因为这样我可以在比较距离时检查结果的z值。

不,您不能使用标准WebGL在同一过程中读取和写入纹理,我认为这根本不是您想要的方式

您的算法在本质上似乎相当串行,不太适合GPU/SIMD执行,但我可能误解了您的意图。请记住,在这种情况下,GPU可能会同时为多个数据点片段/像素运行着色器程序,而对其他数据点的结果一无所知。 您也无法在SIMD体系结构上突破for循环。for循环将继续迭代,尽管不会为其中断的片段编写更改。换句话说,没有速度优势。如果中断条件对所有片段的计算结果相同,则情况就不同了


你可能想看看其他的聚类方法,比如k-means。

关于打破外观的好信息。我不知道。至于其他问题,我知道。情况是,如果有一个不同的算法适合GPU。关于K-means,我已经考虑过了,但我的客户希望根据距离而不是组数进行聚类。如果我正确理解了K-means,那么K-means确实使用了距离作为基础,但它还要求您定义起始质心群集中心,您可以随机选择一个数据点。还有其他的算法,但我必须承认,我不知道他们的心。编辑:你可能想看看,尤其是介绍。