К чему приведет если все потоки блока будут читать/писать в одну и туже перемнную общей памяти (shared += ...) ведь она сопоставима по скорости и латентности с регистровой, но при этом все потоки блока будут "учавствовать в гонке" на запись в эту переменную.
Чем чревато запись в единую для всех потоков блока переменную в общей памяти
[x]
Вход
Amazon
AMD
ATI
brute force
bruteforce
cloud
CUDA
GPGPU
gpgpu.ru
GPU Gems
Intel
Larrabee
Linpack
MapReduce
MD5 crack
Nexus
NVidia
NVidia 8800
NVidia CUDA
NVidia G200
NVidia GTX280
NVidia Nexus
OpenCL
Parallel Nsight
signal processing
sparse matrices
Stream SDK
VISPL
VMWare
web
ВМиК МГУ
МГУ
Москва
Т-Платформы
Физфак МГУ
бенчмарки
блогосфера
вычисления
конкурсы
курсы
новости сайта
обработка изображений
подбор паролей
поиск
программирование GPU
работа
разное
сортировка
фильтрация трафика
численные методы
Navigation
Cвежие комментарии
-
3 days 6 hours ago
-
4 days 4 hours ago
-
4 days 4 hours ago
-
4 days 4 hours ago
-
4 days 4 hours ago
-
4 days 5 hours ago
-
4 days 5 hours ago
-
1 week 1 hour ago
-
2 weeks 6 days ago
-
3 weeks 1 day ago
Новое на форуме
Популярно
- Как начать с самого начала работу с CUDA (33,690)
- Форумы NVidia CUDA: обзор за май (31,711)
- GPGPU и видеокарты AMD (18,140)
- NVidia GTX 280, Tesla T10P (15,735)
- SGEMM на видеокарте и CPU, серия 6 (14,877)
Comments
Я вот насчет писать не понял: K-й поток что-то записал, отчего записанное L-м потоком пропадет?
нет я хотел устроить счетчик. Тоесть К-ый поток читает добавляет свое значение, и L-мый поток займется тем же самым.
По- моему, атомарных операций на shared memory нету.
Т.е. лучше счетчик в каждом треде, а потом, на выходе, суммирование в одном треде.
Ну да я так и сделал ужо :-) Спасибо
Посмотрите на примеры из CUDA SDK: гистограмму и редукцию. Это сложнее простого счетчика, но идея та же самая и сделана эффективно - без конфликтов на банках.
Хотя простой счетчик можно сделать и на регистре (локальной переменной) если не жалко, потом по окончанию треда - записать в глобальную память через atomicAdd.
Через редукционное суммирование должно же быть в разы быстрее чем писать в глобальную память каждым тредом, пусть даже если и 1 раз в треде(как я понимаю во первом случае обращений к памяти будит в BLOCK_SIZE раз меньше)?
ну да, если хочется сильно поэкономить на спичках (один atomicAdd на thread или на блок) - можно потратить не регистр на thread, а слово в shared memory, а потом в конце сложить.
Будет ли это действительно сильно быстрее - не знаю, скорее всего большой разницы не будет.
При чтении из такой переменной это будет быстро - она будет рассылаться всем одновременно (broadcast).
При записи конечно же возникнут проблемы (я так понимаю запись в один адрес), так как будет много bank conflicts, и гонка, как ты уже отметил.