Как выполнить атомарную запись в CUDA? - PullRequest
0 голосов
/ 17 октября 2018

Прежде всего я не могу найти надежный источник, является ли запись атомарной в CUDA или нет.Например, Является ли запись в глобальной памяти атомарной в CUDA? затрагивает эту тему, но последнее замечание показывает, что мы не говорим о том же атомарном понятии.Имея код:

global_mem[0] = pick_at_random_from(1, 2);
shared_mem[0] = pick_at_random_from(1, 2);

, выполняемый gazillion потоков, «атомарный» означает, что в обоих случаях содержимое будет 1 или 2, и гарантировано, что больше ничего не будет отображаться (например, 3).Атомная означает целостность.

Но, насколько я понимаю, CUDA не гарантирует этого, поэтому, когда я запускаю этот код, я потенциально могу получить значение 3?Если это действительно так, как выполнить атомарную запись?Есть atomicExch, но это излишнее - оно делает больше, чем нужно.

Атомарные функции, которые я уже проверил: https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomic-functions

1 Ответ

0 голосов
/ 18 октября 2018

Для операции записи в каждом из 2-х различных потоков в CUDA, если:

  • запись осуществляется в одно и то же место (адрес)
  • этот адрес естественновыровненный для размера записи
  • размер операции записи одинаков для каждого из двух потоков (и имеет размер 1, 2, 4, 8 или 16 байтов)

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

Это напрямую расширяется на любое числопотоков, которые удовлетворяют вышеуказанным условиям.

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

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

При записи векторных величин или структур на C / C ++ следует позаботиться о том, чтобы основная инструкция записи (хранения) в ссылках кода SASSсоответствующий размер.Приведенные выше комментарии, относящиеся к операциям записи, относятся к операциям записи, выполненным кодом SASS.Вообще говоря, я не ожидаю большой разницы между этой интерпретацией и «записями из кода C / C ++» с использованием типов данных POD.Но структуры могут быть разбиты на несколько транзакций меньшего размера, и в этом случае вышеуказанные утверждения будут аннулированы.Тем не менее, с помощью соответствующих практик программирования (например, осторожного использования векторных типов) в C / C ++ возможно гарантировать, что при необходимости будут использоваться 8- или 16-байтовые записи.

...