Как планировщики деформации графического процессора nVIDIA CC 2.1 выдают по две инструкции за один раз? - PullRequest
11 голосов
/ 27 марта 2012

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

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

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

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

1 Ответ

20 голосов
/ 27 марта 2012

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

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

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

Предположим, что исполняющими модулями 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 переместится на следующую стадию в FMADpipe_B.Планировщик деформации теперь выдает вторую половину деформации fmad_1 для FMAD pipe_A, а вторую половину деформации fmad_2 для FMAD pipe_B.

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

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

...