我有一个存储在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中内置了某些东西来模拟互斥锁,那会更好。