Руководство CUDA PTX описывает инструкции «атом» и «красный», которые выполняют атомные и неатомные сокращения. Это новость для меня (по крайней мере, в отношении неатомных сокращений) … Я помню, как учился как сделать сокращения с SHFL Некоторое время назад. Отражены ли эти инструкции или как-то заключены в API CUDA времени выполнения? Или каким-то другим способом, доступным для кода C ++, без написания кода PTX?
Отражены ли эти инструкции или как-то заключены в API CUDA времени выполнения? Или каким-то другим способом, доступным для кода C ++, без написания кода PTX?
Большинство этих инструкций отражены в атомарных операциях (встроенных встроенных функциях), описанных в руководство по программированию. Если вы скомпилируете любую из этих атомных сущностей, вы найдете atom
или же red
инструкции, генерируемые компилятором на уровне PTX или SASS в вашем сгенерированном коде.
red
Тип инструкции, как правило, будет использоваться, если вы явно не используете возвращаемое значение из одной из атомарных сущностей. Если вы используете возвращаемое значение явно, то компилятор обычно выдает atom
инструкция.
Таким образом, должно быть ясно, что эта инструкция сама по себе не выполняет полное классическое параллельное сокращение, но, безусловно, может использоваться для его реализации, если вы хотите зависеть от атомарного оборудования (и связанных ограничений) для ваших операций сокращения. Как правило, это не самая быстрая реализация для параллельных сокращений.
Если вы хотите получить прямой доступ к этим инструкциям, обычный совет будет использовать встроенный PTX где желательно.
В соответствии с просьбой разработать atomicAdd()
В качестве примера:
Если я выполню следующее:
atomicAdd(&x, data);
возможно, потому что я использую это для типичного атомарного сокращения в переменную устройства x
то компилятор выдаст red
(PTX) или же RED
(SASS) инструкция с необходимыми аргументами (указатель на x
и переменная data
2 логических регистра).
Если я выполню следующее:
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
в этом случае) может привести к остановке потока / деформации, пока возвращаемое значение не будет возвращено атомным оборудованием.
Других решений пока нет …