Как я могу использовать «красные» и «атомные» инструкции PTX в коде CUDA C ++?

Руководство CUDA PTX описывает инструкции «атом» и «красный», которые выполняют атомные и неатомные сокращения. Это новость для меня (по крайней мере, в отношении неатомных сокращений) … Я помню, как учился как сделать сокращения с SHFL Некоторое время назад. Отражены ли эти инструкции или как-то заключены в API CUDA времени выполнения? Или каким-то другим способом, доступным для кода C ++, без написания кода PTX?

2

Решение

Отражены ли эти инструкции или как-то заключены в API CUDA времени выполнения? Или каким-то другим способом, доступным для кода C ++, без написания кода PTX?

Большинство этих инструкций отражены в атомарных операциях (встроенных встроенных функциях), описанных в руководство по программированию. Если вы скомпилируете любую из этих атомных сущностей, вы найдете atom или же red инструкции, генерируемые компилятором на уровне PTX или SASS в вашем сгенерированном коде.

red Тип инструкции, как правило, будет использоваться, если вы явно не используете возвращаемое значение из одной из атомарных сущностей. Если вы используете возвращаемое значение явно, то компилятор обычно выдает atom инструкция.

Таким образом, должно быть ясно, что эта инструкция сама по себе не выполняет полное классическое параллельное сокращение, но, безусловно, может использоваться для его реализации, если вы хотите зависеть от атомарного оборудования (и связанных ограничений) для ваших операций сокращения. Как правило, это не самая быстрая реализация для параллельных сокращений.

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

В соответствии с просьбой разработать atomicAdd() В качестве примера:

Если я выполню следующее:

atomicAdd(&x, data);

возможно, потому что я использую это для типичного атомарного сокращения в переменную устройства xто компилятор выдаст red (PTX) или же RED (SASS) инструкция с необходимыми аргументами (указатель на x и переменная data2 логических регистра).

Если я выполню следующее:

int offset = atomicAdd(&buffer_ptr, buffer_size);

возможно, потому что я использую это не для типичного сокращения, а вместо того, чтобы зарезервировать место (buffer_size) в буфере, совместно используемом различными потоками в сетке, который имеет индекс смещения (buffer_ptr) к следующему доступному пространству в общем буфере, тогда компилятор выдаст atom (PTX) или же ATOM (SASS) инструкция, включающая 3 аргумента (offset, &buffer_ptr, а также buffer_sizeв реестрах).

red форма может быть выдана потоком / деформацией, которая затем может продолжаться и обычно не останавливаться из-за этой проблемы с инструкцией, которая, как правило, не имеет зависимостей для последующих инструкций. atom Форма OTOH будет означать изменение одного из трех аргументов (одного из трех логических регистров). Поэтому последующее использование данных в этом регистре (т. Е. Возвращаемое значение встроенного, т. Е. offset в этом случае) может привести к остановке потока / деформации, пока возвращаемое значение не будет возвращено атомным оборудованием.

3

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

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

По вопросам рекламы [email protected]