GLSL可以在一个操作中进行比较和书写吗?

时间:2018-10-19 23:20:38

标签: algorithm parallel-processing glsl gpu

我有一个存储在SSBO中的变量,所有着色器都必须读取该变量,并将其与一个值进行比较并有条件地设置该值。更明确地说,以下指令应作为“原子”操作完成:

SSBO[index] = SSBO[index] <= 0? atomicAdd(buffer_size) : SSBO[index];

更明确地说,我有一棵树,它的内存必须由每个线程同时动态分配以保持数据紧凑(我不能假设孩子是父* 2的索引和父* 2 +1的索引,因为这些会浪费太多内存)。

我知道有一种方法可以通过“锁定”内存(如果它为0)将其设置为-1,在数据为0或-1时进行繁忙循环,然后执行原子加法。

类似的东西:

 while ((tree[node].children[child] <= 0) && (mrun > 0)){
            mrun--;
            //If the node wasn't allocated, allocate its memory (which also releases the lock)
            if( (atomicCompSwap( tree[node].children[child] , 0 , -1) == 0 ))
            {
                tree[node].children[child] = int(atomicAdd(t_index, 1));
            }
        }

在我看来,忙循环是一个糟糕的解决方案。由于它本质上效率低下,并且如果GLSL中内置了某些东西来模拟互斥锁,那会更好。

0 个答案:

没有答案