#cuda #gpu #nvidia #gpgpu
#cuda #gpu #nvidia #gpgpu
Вопрос:
У меня есть программа CUDA, в которой одному warp необходимо получить доступ (например) к 96 байтам глобальной памяти.
Он правильно выравнивает местоположение памяти и индексы полосы, чтобы доступ объединялся и выполнялся за одну транзакцию.
Программа может выполнять доступ, используя 12 полос, каждая из которых обращается к uint8_t. В качестве альтернативы он будет использовать 6 полос для доступа к uint16_t или 3 полосы для доступа к uint32_t.
Есть ли разница в производительности между этими альтернативами, быстрее ли доступ, если каждый поток обращается к меньшему объему памяти?
Когда объемы памяти, к которым должен обращаться каждый warp, различаются, есть ли преимущество в ее оптимизации таким образом, чтобы потоки могли получать доступ к меньшим блокам (16 бит или 8 бит), когда это возможно?
Ответ №1:
Не зная, как данные будут использоваться один раз в регистрах, трудно указать оптимальный вариант. Почти для всех графических процессоров разница в производительности между этими параметрами, вероятно, будет очень небольшой.
Графический процессор NVIDIA L1 поддерживает возврат либо 64 байт / деформация (CC5., 6.), либо 128 байт / деформация (CC3., CC7.) из L1. Пока размер <= 32 бита на поток, производительность должна быть очень похожей.
В CC 5. / 6. может быть небольшое преимущество в производительности для уменьшения количества предопределенных истинных потоков (предпочитают большие данные). Модуль L1TEX разбивает глобальный доступ на запросы 4 x 8 потоков. Если полные группы из 8 потоков отключены, цикл L1TEX сохраняется. Обратная запись в файл регистра занимает такое же количество циклов. Порядок группировки потоков не раскрывается.
Хорошей практикой является написание микро-бенчмарка. Профилировщики CUDA имеют множество счетчиков для разных частей пути L1TEX, чтобы помочь увидеть разницу.