Я пытаюсь реализовать произвольное чтение и запись в RWStructuredBuffer из нескольких групп потоков. Состояние гонки может возникнуть, когда два потока (в другой группе потоков) работают одновременно (на разных мультипроцессорах), и они оба пытаются читать / записывать один и тот же элемент в RWStructuredBuffer.
Когда все потоки находятся в одной и той же группе потоков, я могу использовать атомарные элементы для одновременной записи / чтения, поэтому мое решение состоит в том, чтобы отправлять мой CS несколько раз одновременно с одной группой потоков, например, так:
for (UINT x = 0; x < mX; ++x)
{
for (UINT y = 0; y < mY; ++y)
{
for (UINT z = 0; z < mZ; ++z)
{
//...
cmdList->Dispatch(1, 1, 1);
}
}
}
Таким образом, если два потока из разных групп потоков хотят получить доступ к одной и той же части памяти, они должны делать это последовательно.
Мой вопрос заключается в том, является ли это хорошим решением для моей проблемы, поскольку могут возникнуть некоторые проблемы с драйверами из-за многочисленных обращений к графическому API.
API — Directx12, а HLSL компилируется с использованием шейдерной модели 5.1.
Спасибо за помощь.
Ура,
Боян!
Во-первых, если вы используете DX12 и не вставляете барьеры БПЛА между вызовами, они будут работать вместе без контроля, как если бы вы звонили Dispatch(mx,my,mz)
,
Но две разные группы или даже рассылки отлично подходят для чтения и записи, если вы используете только атомарные операции. Так же, как вы сделали бы на версии процессора.
Других решений пока нет …