Как планировщики nVIDIA CC 2.1 GPU выдают 2 инструкции одновременно за варп?

Примечание. Этот вопрос специфичен для устройств nVIDIA Compute Capability 2.1. Следующая информация получена в Руководстве по программированию CUDA v4.1:

В вычислительной способности 2.1 устройств каждый SM имеет 48 SP (ядер) для операций с целыми числами и с плавающей запятой. Каждый warp составлен из 32 последовательных потоков. Каждый SM имеет 2 планировщика warp. На каждом время выдачи команды, один планировщик деформаций выбирает готовый потоки и проблемы 2 инструкции для основы на ядрах.

Мои сомнения:

  • Один поток будет выполняться на одном ядре. Как устройство может выдавать 2 инструкции потоку за один такт или одну операцию с несколькими циклами?
  • Означает ли это, что две инструкции должны быть независимы друг от друга?
  • Чтобы две команды могли выполняться параллельно на ядре, возможно, потому, что они используют разные исполнительные блоки в ядре? Означает ли это также, что варп будет готов следующий только после того, как 2 инструкции будут завершены или это будет после одного из них?

Ответ 1

Это уровень уровня parallelism (ILP). Инструкции, изданные из варпа одновременно, должны быть независимыми друг от друга. Они выдаются планировщиком инструкций SM для разделения функциональных блоков в SM.

Например, если есть две независимые команды FMAD в потоке команд warp, которые готовы к выпуску, и у SM есть два доступных набора единиц FMAD, на которых они будут выпущены, оба они могут быть выпущены в том же цикле. (Инструкции могут быть изданы вместе в различных комбинациях, но я не запомнил их, поэтому я не буду приводить подробные сведения здесь.)

Модули исполнения FMAD/IMAD в SM 2.1 имеют ширину 16 SP. Это означает, что для выполнения инструкции по деформации (32 потока) для одного из 16-исполнительных блоков требуется 2 цикла. Существует несколько (3) из этих 16-разрядных исполнительных блоков (всего 48 SP) на SM, плюс специальные функциональные блоки. Каждый планировщик warp может выдавать до двух из них за цикл.

Предположим, что исполнительные модули FMAD: pipe_A, pipe_B и pipe_C. Скажем, что на этапе 135 существуют две независимые команды FMAD fmad_1 и fmad_2, которые ждут:

  • В цикле 135 планировщик команд выдаст первую половину деформирования (16 потоков) fmad_1 в FMAD pipe_A, а первая половина деформации fmad_2 на FMAD pipe_B.
  • В цикле 136 первая половина деформации fmad_1 переместится на следующий этап в FMAD pipe_A, и аналогично первая половина деформации fmad_2 переместится на следующий этап в FMAD pipe_B, Планировщик warp теперь выдает второй аргумент fmad_1 на FMAD pipe_A, а второй - на fmad_2 на FMAD pipe_B.

Таким образом, требуется 2 цикла для выдачи 2 инструкций из одного и того же варпа. Но, как указывает OP, есть два планировщика warp, что означает, что весь этот процесс может выполняться одновременно для команд из другого warp (при условии наличия достаточных функциональных блоков). Следовательно, максимальная скорость выпуска составляет 2 инструкции по деформации за цикл. Обратите внимание, что это абстрактное представление для перспективы программиста: фактические архитектурные детали низкого уровня могут быть разными.

Что касается вашего вопроса о том, когда варп будет готов дальше, если есть больше инструкций, которые не зависят от каких-либо выданных (уже выпущенных, но не удаленных) инструкций, то они могут быть выпущены в следующем цикле. Но как только только доступные инструкции зависят от инструкций в полете, варп не сможет выдавать. Однако в этом случае возникают другие искажения - SM может выдавать инструкции для любого резидентного варпа, который имеет доступные (незаблокированные) инструкции. Это произвольное переключение между перекосами - это то, что обеспечивает "скрытие задержек", на которые GPU зависят от высокой пропускной способности.