Может ли кто-нибудь сказать мне, возможен ли в DirectX 11 следующий вычислительный шейдер?Compute shader: читать данные, записанные в одном потоке из другого?
Я хочу, чтобы первый поток в диспетчере, который обращается к элементу в буфере (g_positionsGrid), чтобы установить (сравнить обмен) этот элемент с временным значением, чтобы обозначить, что он предпринимает некоторые действия.
В этом случае значение temp равно 0xffffffff, и первый поток продолжит работу и выделяет значение из структурированного буфера добавления (g_positions) и назначает его этому элементу.
Так что все до сих пор, но другие потоки в отправке могут входить между обменом обмена и распределением первого потока, и поэтому нужно подождать, пока не будет доступен индекс распределения. Я делаю это с оживленным ожиданием, т.е. циклом while.
Однако, к сожалению, это просто блокирует GPU, поскольку я предполагаю, что значение, записанное в первом потоке, не передается другим нитям, застрявшим в цикле while.
Есть ли способ получить эти потоки, чтобы увидеть это значение?
Спасибо за помощь!
RWStructuredBuffer<float3> g_positions : register(u1);
RWBuffer<uint> g_positionsGrid : register(u2);
void AddPosition(uint address, float3 pos)
{
uint token = 0;
// Assign a temp value to signify first thread has accessed this particular element
InterlockedCompareExchange(g_positionsGrid[address], 0, 0xffffffff, token);
if(token == 0)
{
//If first thread in here allocate index and assign value which
//hopefully the other threads will pick up
uint index = g_positions.IncrementCounter();
g_positionsGrid[address] = index;
g_positions[index].m_position = pos;
}
else
{
if(token == 0xffffffff)
{
uint index = g_positionsGrid[address];
//This never meets its condition
[allow_uav_condition]
while(index == 0xffffffff)
{
//For some reason this thread never gets the assignment
//from the first thread assigned above
index = g_positionsGrid[address];
}
g_positions[index].m_position = pos;
}
else
{
//Just assign value as the first thread has already allocated a valid slot
g_positions[token].m_position = pos;
}
}
}