Вполне вероятно, что эта информация применима только для вычисления возможностей 1.x или cuda 2.0. Более поздние архитектуры и cuda 3.0 имеют более сложный доступ к глобальной памяти, и фактически «объединенные глобальные нагрузки» даже не профилируются для этих чипов.
Кроме того, эта логика может быть применена к общей памяти, чтобы избежать конфликтов банков.
Транзакция объединенной памяти - это транзакция, в которой все потоки в полусфере одновременно обращаются к глобальной памяти. Это слишком просто, но правильный способ сделать это - просто иметь последовательные потоки, обращающиеся к последовательным адресам памяти.
Таким образом, если потоки 0, 1, 2 и 3 читают глобальную память 0x0, 0x4, 0x8 и 0xc, это должно быть объединенное чтение.
В примере с матрицей имейте в виду, что вы хотите, чтобы ваша матрица линейно находилась в памяти. Вы можете делать это как хотите, и ваш доступ к памяти должен отражать, как устроена ваша матрица. Итак, матрица 3х4 ниже
0 1 2 3
4 5 6 7
8 9 a b
может быть сделано строка за строкой, например, так что (r, c) отображается в память (r * 4 + c)
0 1 2 3 4 5 6 7 8 9 a b
Предположим, вам нужно получить доступ к элементу один раз и сказать, что у вас есть четыре потока. Какие темы будут использоваться для какого элемента? Возможно либо
thread 0: 0, 1, 2
thread 1: 3, 4, 5
thread 2: 6, 7, 8
thread 3: 9, a, b
или
thread 0: 0, 4, 8
thread 1: 1, 5, 9
thread 2: 2, 6, a
thread 3: 3, 7, b
Что лучше? Что приведет к слиянию операций чтения, а что нет?
В любом случае каждый поток имеет три доступа. Давайте посмотрим на первый доступ и посмотрим, будут ли потоки обращаться к памяти последовательно. В первом варианте первый доступ - 0, 3, 6, 9. Не последовательно, не объединено. Второй вариант, это 0, 1, 2, 3. Последовательный! Слившихся! Ура!
Лучший способ, вероятно, написать свое ядро и затем профилировать его, чтобы увидеть, есть ли у вас не слитые глобальные загрузки и хранилища.