Я надеюсь, что смогу читать и записывать потенциально те же элементы SSBO как часть гибкого симулятора с использованием вычислительных шейдеров, но у меня проблемы с синхронизацией. У меня есть тестовый шейдер, который запускается 16 раз, с тремя вариантами ниже, которые, надеюсь, показывают, что я пытаюсь сделать.
layout (std430, binding=8) coherent buffer Debug
{
int debug[ ];
};
shared int sharedInt;
layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in;
void main()
{
/////// 1. ///////
sharedInt = debug[0];
memoryBarrierShared();
barrier();
debug[0] = sharedInt[0] + 1;
memoryBarrierShared();
barrier();
// Print debug[0]: 1
/////// 2. ///////
atomicAdd(debug[0], 1);
// Print debug[0]: 16
/////// 3. ///////
sharedInt = debug[0];
memoryBarrierShared();
barrier();
atomicExchange(debug[0], debug[0]+1);
memoryBarrierShared();
barrier();
// Print debug[0]: 1
}
* Просто для ясности, я запускаю только один из вариантов за раз.
Результат, который я пытаюсь получить для всех из них, заключается в том, что значение debug[0] равно 16, хотя мне нужно использовать что-то вроде 1-го или 3-го варианта в моем моделировании, так как мне нужно читать и записывать в SSBO в та же нить.
Я не уверен, что понимаю роль общей переменной, и, насколько я понимаю, memoryBarrierShared() должен сделать чтение и запись sharedInt видимым для каждого потока в рабочей группе, хотя, если я это сделаю, будет только одна работа Группа отправлена, это тот же результат.
Спасибо за любую помощь.
debug[0]
было 16, но на самом деле неясно, почему № 2 не является приемлемым решением этой проблемы. - person Nicol Bolas   schedule 12.08.2016