Чем чревато запись в единую для всех потоков блока переменную в общей памяти

К чему приведет если все потоки блока будут читать/писать в одну и туже перемнную общей памяти (shared += ...) ведь она сопоставима по скорости и латентности с регистровой, но при этом все потоки блока будут "учавствовать в гонке" на запись в эту переменную.

Forums: 

При чтении из такой

При чтении из такой переменной это будет быстро - она будет рассылаться всем одновременно (broadcast).
При записи конечно же возникнут проблемы (я так понимаю запись в один адрес), так как будет много bank conflicts, и гонка, как ты уже отметил.

нет я хотел устроить счетчик.

нет я хотел устроить счетчик. Тоесть К-ый поток читает добавляет свое значение, и L-мый поток займется тем же самым.

По- моему, атомарных операций

По- моему, атомарных операций на shared memory нету.

Т.е. лучше счетчик в каждом треде, а потом, на выходе, суммирование в одном треде.

Посмотрите на примеры из CUDA

Посмотрите на примеры из CUDA SDK: гистограмму и редукцию. Это сложнее простого счетчика, но идея та же самая и сделана эффективно - без конфликтов на банках.

Хотя простой счетчик можно сделать и на регистре (локальной переменной) если не жалко, потом по окончанию треда - записать в глобальную память через atomicAdd.

Через редукционное

Через редукционное суммирование должно же быть в разы быстрее чем писать в глобальную память каждым тредом, пусть даже если и 1 раз в треде(как я понимаю во первом случае обращений к памяти будит в BLOCK_SIZE раз меньше)?

ну да, если хочется сильно

ну да, если хочется сильно поэкономить на спичках (один atomicAdd на thread или на блок) - можно потратить не регистр на thread, а слово в shared memory, а потом в конце сложить.

Будет ли это действительно сильно быстрее - не знаю, скорее всего большой разницы не будет.