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

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

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

Forums: 

Будет. Броадкастинга при

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

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

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

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

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

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

Покопался в Programming Guide

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

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

Да, связаны. Объем shared

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

Ну да, каждая версия toolkit

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

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

То есть получается при записи

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

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

Они interleaved через слово

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

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

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

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

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

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

Кстати, в новой

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