CUDA объединяет скорость доступа к памяти в зависимости от размера слова - PullRequest
1 голос
/ 18 апреля 2019

У меня есть программа CUDA, в которой одна деформация требует доступа (например) к 96 байтам глобальной памяти.

Правильно выравнивает ячейку памяти и индексы дорожек так, что доступ объединяется и выполняется в одной транзакции.

Программа может сделать доступ, используя 12 линий, каждая из которых имеет доступ к uint8_t. В качестве альтернативы он будет использовать 6 полос доступа к uint16_t или 3 полосы доступа к uint32_t.

Есть ли разница в производительности между этими альтернативами, быстрее ли доступ, если каждый поток обращается к меньшему объему памяти?

Когда объемы памяти, к которым требуется доступ каждой деформации, различаются, есть ли смысл оптимизировать ее так, чтобы потоки создавались для доступа к меньшим единицам (16 или 8 бит), когда это возможно?

1 Ответ

4 голосов
/ 18 апреля 2019

Не зная, как данные будут использоваться один раз в регистрах, сложно определить оптимальный вариант.Почти для всех графических процессоров разница в производительности между этими опциями, вероятно, будет очень мала.

NVIDIA GPU L1 поддерживает возврат либо 64 байта / деформация (CC5. , 6. ), либо 128 байтов / деформацию(CC3. , CC7. ) возвращается из L1.Пока размер <= 32 бита на поток, производительность должна быть очень похожей. </p>

В CC 5. / 6. может быть небольшое преимущество в производительности для уменьшения количествапредикаты истинных потоков (предпочитают большие данные).Модуль L1TEX разбивает глобальный доступ на 4 потока по 8 запросов.Если полные группы из 8 потоков предопределены, то цикл L1TEX сохраняется.Обратная запись в регистровый файл занимает столько же циклов.Порядок группировки потоков не раскрывается.

Хорошей практикой является написание микро-эталона.Профилировщики CUDA имеют многочисленные счетчики для разных частей пути L1TEX, чтобы помочь увидеть разницу.

...