Я пытаюсь сделать глобальный связанный список для Форвард + заливка, но есть некоторыеOpenGL Compute Shader синхронизация между группами
трудности в ходе реализации.
Для каждой группы в вычислительном шейдере она имеет общую переменную: локальный индексный массив, и этот массив имеет переменную длину (емкость постоянна, но контент отсутствует). Вот пример:
общий массив int [1024]; // декларация в GLSL
общая длина int; // это также общая переменная в рабочей группе.
Группа 0: длина = 4, массив = 3, 5, 7, 1, -1, -1, -1, -1 .... (-1 = не действует)
Группа 1: длина = 2, массив = 1, 6, -1, -1, -1 ....
Группа 2: длина = 1, массив = 8, -1, -1, -1, -1 .. ..
Теперь я хочу объединить эти индексы в глобальный массив индексов. то есть объект буфера хранилища шейдеров. Порядок основан на индексе группы:
Глобальный массив индекс: 3, 5, 7, 1, 1, 6, 8, -1, -1, -1 ......
сложности Я не знаю, как синхронизировать между различными группами. Поскольку барьер() в OpenGL гарантирует только синхронизацию в той же группе.
И я нашел в другом сообщении, что OpenGL не поддерживает синхронизацию между различными группами.
OpenGL Compute shader sync different work groups
Итак, мой вопрос. В любом случае, для достижения моей цели?
Например, можно объявить некоторый объект буфера хранилища шейдеров, такой как последний идентификатор группы, который завершил обновление, и смещение глобального массива индексов?
пример:
unit latestGroupIDUpdated = -1; // a SSBO
unit globalIdxOffset = 0; // a SSBO
in each group:
while(myGroupId - 1 != latestGroupIDUpdated)
{ //keep waiting }
// my previous group has updated the global list
globalIdxOffset+= myArrayLength;
latestGroupIDUpdated = myGroupId;
//now start appending the local index array into global index array
Будет ли работает эта попытка? Или это не удастся и почему?
Если это не удастся, какой подход рекомендуется?
Когда вы говорите «группа», вы имеете в виду «рабочую группу», верно? Если это так, рабочие группы не могут иметь разную длину. Если по длине вы ссылаетесь на количество запросов на группу. –
да, группа означает рабочая группа –
И разные длины? –