У меня есть переменная, которая хранится в SSBO, которая должна быть прочитана всеми шейдерами, сравнена со значением и условно установлена в это значение.Чтобы быть более точным, следующую инструкцию следует выполнять как «атомарную» операцию:
SSBO[index] = SSBO[index] <= 0? atomicAdd(buffer_size) : SSBO[index];
Чтобы быть более точным, у меня есть дерево, чья память должна динамически выделяться каждым потоком одновременно, чтобы сохранить данныекомпактный (я не могу предположить, что дочерние элементы - это индекс родительского элемента * 2 и индекс родительского элемента * 2 + 1, потому что они будут тратить слишком много памяти).
Я знаю, что есть способ «заблокировать» память, установив для нее значение -1, если оно равно 0, цикл занятости, когда данные равны 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 встроено что-то для эмуляции мьютексов, было бы лучше.