Как объяснить сверхлинейное ускорение, наблюдаемое в GPU-устройстве с кодом CUDA?

У меня возникли проблемы с пониманием производительности масштабирования при смущающе-параллельных вычислениях на Tesla C1060. Запустив его, используя все блоки и несколько потоков на блок, я получаю время выполнения около 0,87 с.

Однако, если я запускаю все итерации только в одном блоке с одним потоком на блок, время выполнения составляет до 1872 с, что намного больше, чем 240x0,87 с = 209 с, которые я ожидал бы от простого масштабирования до использования только одного из 240 потоковых процессоров.

Вместо этого, используя все 240 ядер, кажется, я получаю ускорение более чем в 2000 раз. Как могло быть возможно такое сверхлинейное ускорение; на какие еще факторы следует обратить внимание при моделировании производительности этой системы?


person Alaya    schedule 22.05.2014    source источник
comment
Re: закрытые голоса - я думаю, что это на самом деле довольно полезный вопрос о моделировании производительности для кодов GPU; Я попытался отредактировать вопрос, чтобы показать это немного больше.   -  person Jonathan Dursi    schedule 22.05.2014


Ответы (1)


Запуск ядра, состоящего из 1 потока, ограничивает выполнение ядра до 1 из 30 SM. Для каждой выпущенной команды деформации будет использоваться только 1/32 единиц исполнения. Кроме того, инструкции из одного и того же варпа не могут быть выданы в слотах выдачи подряд, оставляя как минимум 1/2 слота выдачи пустыми. Дополнительный слот будет пуст для зависимости инструкций и задержки памяти, оставляя 2-4-кратное ускорение. Предположим, действительно пессимистичный 2x. Грубый расчет возможного выигрыша будет

30x increase for using all 30 SMs
32x increase for using full width of the execution units
 2x increase for using issue slots and saturating memory system
= 30 * 32 * 2
= >1920x performance increase

Вы видите разницу в 1872/0,87 = 2152x. Это легко объяснить более чем 2-кратным из-за пустых слотов для задач и того факта, что 1 варп на SM не может насытить систему памяти.

person Greg Smith    schedule 22.05.2014
comment
Итак, если я запускаю однопоточную программу CUDA, значит ли это, что следующая инструкция не будет выдана до завершения выполнения текущей инструкции? или существует ли какой-либо параллелизм на уровне инструкций для однопоточной программы CUDA? - person Alaya; 24.05.2014