Предотвращает ли чтение массива int из общей памяти банковские конфликты?

Я проектирую ядро ​​CUDA, которое будет запускаться с 16 потоками на блок потоков. У меня есть массив из N ints в разделяемой памяти (т.е. на блок потока), который я хочу обработать.

Если шаблон доступа потоков является последовательным в массиве, значит ли это, что не будет никаких банковских конфликтов? Я понимаю, что если бы массив представлял собой массив символов, возникли бы конфликты банков, но я не совсем уверен, что произойдет, если это массив типа int. Я предполагаю, что будут конфликты банков, потому что каждый набор из 4 последовательных целых разделяет один и тот же банк памяти?

Если это правда, то каково правильное решение для предотвращения банковских конфликтов? Адресное шифрование, как в образце гистограммы?

1 ответ

Решение

Для устройств с вычислительными возможностями>= 2.0 разделяемая память организована в 32-битные слова, которые чередуются. Таким образом, если каждый поток в деформации (деформация состоит из 32 нитей) обращается к последовательным 32-битным словам, конфликты между банками не возникнут. Кроме того, разные потоки могут получить доступ к одному и тому же 32-битному значению, не вызывая конфликтов в банке. Это означает, что также не будет никаких банковских конфликтов, если все потоки прочитают последовательные значения из массива символов.

Конфликты банков на самом деле вызваны только тем, что два или более потоков обращаются к разным 32-разрядным словам, кратным 32 адресам.

Ответ на этот вопрос может быть другим для других вычислительных возможностей - я не проверял.

Обратите внимание, что 16 потоков на блок очень мало. При таком низком размере блока я не думаю, что вы сможете улучшить производительность графического процессора по сравнению с центральным процессором (если только это не малая часть общей рабочей нагрузки и данные уже находятся в памяти графического процессора).

Другие вопросы по тегам