2013-02-27 5 views
1

Скажем, у нас есть 16 потоков, выполняющихся на блоке 1, и еще 16 потоков, выполняющихся на блоке 2.Совместный доступ к блокам в CUDA?

Каждый поток читает 1 double из памяти: 16 потоков на блоке 1 нужно читать 16 удвоений по адресам памяти 0- 127 и 16 потоков на блоке 2 необходимо читать с адресов 128-255.

Я знаю, что память, читаемая для 16 потоков на блоке 1, может быть выполнена в одной транзакции памяти из-за совместного доступа.

Мой вопрос в том, когда мы рассматриваем эти два блока, сколько нам требуется транзакций памяти, один или два? Другими словами, возможен ли доступ к памяти разными блоками одновременно?

ответ

2

Блоки полностью независимы - аппаратные средства могут выбирать (и, вероятно, - будут) запускать их на разных мультипроцессорах.

Резьба из разных блоков будет работать в разных перекосах. Следовательно, невозможно объединить доступ к памяти между ними.

+0

И, кроме того, в описанном вами сценарии не будет никакой пользы. Коалесценция расширяется до максимального размера строки кеша L1, то есть 128 байт. Два запроса по 128 байт будут обрабатываться в двух транзакциях независимо от того, происходят ли они из одного или двух блоков. 16 потоков, выровненных по соседству с двойными, даст вам максимальную возможную совместную выгоду. –

1

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

Кроме того, даже если потоки сформировали одну деформацию или заняли один и тот же многопроцессорный и общий кэш L1, адреса из основы преобразуются в строки 128B или 32B (в зависимости от режима кэширования/не кэширования), поэтому в случае в режиме кэширования вам потребуется как минимум 2 транзакции, а в случае транзакций без кэширования 8. Посмотрите на this очень полезную презентацию для лучшего понимания доступа к глобальной памяти.

Смежные вопросы