Для каких размеров обычная загрузка и сохранение в глобальной памяти в 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
инструкции.