Вычислить шейдерную запись в RWStructuredBuffer случайным образом из нескольких групп потоков

Я пытаюсь реализовать произвольное чтение и запись в 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.

Спасибо за помощь.
Ура,
Боян!

0

Решение

Во-первых, если вы используете DX12 и не вставляете барьеры БПЛА между вызовами, они будут работать вместе без контроля, как если бы вы звонили Dispatch(mx,my,mz),

Но две разные группы или даже рассылки отлично подходят для чтения и записи, если вы используете только атомарные операции. Так же, как вы сделали бы на версии процессора.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector