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