Для каких размеров обычная загрузка и сохранение в глобальной памяти в CUDA Atomic?

Являются ли общие операции чтения и записи в глобальной памяти атомарными в CUDA, если:

  • Это 4-х байтовая инструкция? (Я предполагаю, что да)
  • Это 8-байтовая или 16-байтовая инструкция? (Я предполагаю, что да)

По крайней мере, на Кеплере и Ферми обычно 4-байтовые операции чтения и записи в атомарную глобальную память на уровне деформации или инструкции с 8/16 байтами на уровне деформации половины / четверти, если:

  • Все потоки деформации обращаются к одному и тому же 32-байтовому блоку транзакции L2? (Я предполагаю, что да)
  • Потоки деформации получают доступ к различным 32-байтовым блокам транзакций L2, но все потоки деформации получают доступ к одной и той же 128-байтовой строке кэша L2? (Я предполагаю нет)
  • Все потоки деформации обращаются к разным строкам кэша L2? (Я предполагаю нет)

Если какое-либо из этих предположений об атомарности на уровне деформации верное, существует ли какой-либо способ использовать эти знания, не рискуя совместимостью с будущими вычислительными возможностями в будущем?

1 ответ

Чтение и запись обычно происходят в отношении кешей. К тому времени, когда транзакции передаются в глобальную память, в программировании CUDA или модели памяти нет гарантии атомарности, если только atomic инструкции используются.

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

Имейте в виду, что L2 является кэшем обратной записи, его нельзя отключить, и он не игнорируется глобальными операциями чтения и записи, за исключением случая atomic инструкции.

Другие вопросы по тегам