CUDA: доступ к shared-памяти

Tagged:  

Добрый день! Возник такой вопрос:

Имеется массив значений в shared -памяти. Потоки обращаются к ячейкам этого массива, причём одновременно к одной и той же ячейке. Выглядит так - цикл; на итерации N каждый поток читает из массива ячейку под индексом N. Собственно вопрос: будет ли падать производительность из-за одновременного чтения потоками одной и той же ячейки?

Comments

Будет. Броадкастинга при доступе к шаред-памяти нет. Если только в самых последних релизах что-то не изменилось.

На чтение броадкастинг есть.

Вот читаю раздел G3 нового Programming Guide (3.0), это про sm_1x:
G.3.3.3
Shared memory features a broadcast mechanism...

Т.е. если читается одно и то же значение - то броадкастинг как раз есть.
Что будет с записью - не разбирался (оно и неважно :)

Про Ферми написано то же самое - конфликт банков есть при доступе к *разным* 32-битным словам в одном банке (G4.3)

Покопался в Programming Guide 2.0 нарыл такую же инфу.
Объясните плиз, что за "версии" у этого документа (они как-то связаны с версиями toolkit'a, али как? )

Да, и еще: чёт никак не врублюсь, какова же ёмкость "одной банки" shared памяти?

Ну да, каждая версия toolkit идет с докой своей же версии (правда тулкит 3.0-beta был с докой от 2.3).

Емкость банки до Ферми - 1 килобайт (16кб, 16 банок), у Ферми, как я понимаю, 32 2-килобайтных банки, которые делятся между локальным кэшом и shared memory по запросу приложения.

То есть получается при записи float значений в shared-массив (поток N -> ячейка N) будет конфликт банков памяти? Ведь выходит, что массив лежит в пределах одного банка.

Хотя смотрел пример перемножения матриц, там при копировании подматриц никаких запарок не было вроде.

Они interleaved через слово (4 байта), поэтому если номер слова равен номеру потока (+константа), то конфликтов не будет.

Кстати, в новой документации пишут, что конфликтов не будет (для Fermi), если треды будут писать(читать) double word (т.е. 8B для каждого треда).

Спасибо! Вроде вник в суть вещей.

Как я понял конфликты возникают только внутри одного half-warp'a (как раз 16 потоков), и следовательно при задании правильного шага индекса этих конфликтов не будет (независимо от количества запущенных потоков)

И еще до кучи один вопрос вспомнил про разделяемую память =)

Как можно создать указатель на этот тип памяти, каков синтаксис? Просто при объявлении указателя компилятор пишет такое: "Cannot tell what pointer points to, assuming global memory space"
А указатель этот, собственно, нужен чтобы сократить на один индекс обращение к двумерному массиву

Да, связаны.
Объем shared memory и количество банков зависит от архитектуры (можно посмотреть, например, в аппендиксе G1, в CUDA Programming Guide 3.0 )

Copyright © 2008-2011 Alex Tutubalin