Оптимизация Cuda, мультипроцессоры, параллельное выполнение ядра

#optimization #cuda

#оптимизация #cuda

Вопрос:

У меня есть несколько вопросов: (Я потратил довольно много времени, просто пытаясь найти ответы)

  1. Где я могу найти информацию о максимальном количестве блоков на потоковый мультипроцессор на моем устройстве? (Я знаю, что это может быть 16 блоков, но не могу это подтвердить) Мне нужно прочитать это как myDevice.maxBlocksPerMultiProcessor внутри кода.

  2. Будет ли запуск ядра по умолчанию (например, <<<blocks, threads>>> в потоке по умолчанию 0) равномерно распределять вычисления между всеми мультипроцессорами? (Или только один мультипроцессор будет выполнять всю работу).
    Я понимаю, что это зависит от конфигурации моей сетки, и я не спрашиваю об этом. Давайте просто предположим, что у меня «дружественная к производительности» сетка (я имею в виду block-threads / maxThreadPerMultiProcessors максимизацию загрузки мультипроцессоров).
    Будет ли он запускаться на нескольких мультипроцессорах по умолчанию?

  3. Допустим: мой графический процессор поддерживает 16 блоков на мультипроцессоры и 2048 maxThreadPerMultiProcessors. Затем я хотел бы запустить свое ядро с <<< N*16, 126 >>> , чтобы максимально увеличить загрузку мультипроцессоров. Могу ли я повысить производительность, используя потоки и / или параллельное выполнение ядра?
    (Я так не думаю, потому что я не могу получить более 100% загрузки мультипроцессора * я понимаю, это звучит абсурдно, но мой английский не идеален *)

извините за мой плохой английский!
спасибо за вашу помощь!

Ответ №1:

  1. Где я могу найти информацию о максимальном количестве блоков на потоковый мультипроцессор на моем устройстве?

    Вы можете получить эту информацию из руководства по программированию здесь. Вы захотите узнать о вычислительных возможностях вашего устройства. Вы можете посмотреть это здесь. Вычислительные возможности вашего устройства также могут быть восстановлены программно; изучите deviceQuery примерный код CUDA для примера. Если вам программно требуется максимальное количество блоков на мультипроцессор, вам нужно будет включить в свою программу версию таблицы из руководства по программированию, на которое дана ссылка выше, а затем использовать вычислительные возможности для определения ее во время выполнения.

  2. Будет ли запуск ядра по умолчанию (например, <<<blocks, threads>>> в потоке по умолчанию 0) равномерно распределять вычисления между всеми мультипроцессорами?

    Да, это фундаментальная часть модели программирования CUDA. Пока вы запустили достаточно блоков, чтобы разместить хотя бы по одному на каждом SM, распределитель GPU work распределит блоки настолько равномерно, насколько это возможно.

  3. Да, запуск ядра, <<<N, 128>>> где N достаточно большой, должен быть фактором, способствующим достижению максимальной загрузки. Занятость может иметь различные другие ограничители (например, регистры, использование общей памяти и т.д.), Так что это ничего не гарантирует, но должно допускать максимальную занятость (2048 потоков на SM) в вашем примере. Что касается потоков (я думаю, вы действительно хотите спросить о параллельных ядрах), то в целом верно, что после того, как вы выявили достаточный параллелизм для насыщения определенного графического процессора, увеличение параллелизма может не дать никаких дополнительных преимуществ. Однако это может принести пользу будущему графическому процессору, и, кроме того, потоки позволяют использовать не только параллельные ядра. Потоки позволяют дублировать копирование и вычисления, что может быть еще одним ценным фактором повышения общей производительности.

Многие из этих тем рассматриваются в разделах 2-5 руководства по программированию, посвященных модели программирования CUDA, аппаратной реализации и рекомендациям по производительности. В руководстве по передовым методам CUDA также содержится полезная информация.

Комментарии:

1. я не могу выяснить, как получить максимальное количество блоков на потоковый мультипроцессор. Можете ли вы сказать что-то еще, мне нужна эта информация.

2. я сделал это, мой вывод ничего не говорит о максимальных блоках на потоковый многопроцессор. мой вывод в pastbin

3. Извините, моя ошибка. этот атрибут недоступен программно напрямую. Если вам нужна эта информация в вашей программе во время выполнения, вам нужно будет включить данные руководства по программированию в таблицу в вашей программе, затем посмотреть вычислительные возможности во время выполнения и использовать это для определения атрибута. Я соответствующим образом изменил свой ответ.