Подтвердить что ты не робот

GPGPU против Multicore?

Каковы основные практические различия между GPGPU и регулярным многоядерным/многопоточным программированием ЦП, с точки зрения программиста? В частности:

  • Какие типы проблем лучше подходят для регулярной многоядерности и какие типы лучше подходят для GPGPU?

  • Каковы основные отличия в модели программирования?

  • Каковы основные отличия оборудования, которые требуют каких-либо различий в модели программирования?

  • Какой из них обычно проще использовать и на сколько?

  • Является ли практическим в долгосрочной перспективе реализовать библиотеки уровня parallelism для графического процессора, такие как параллельная библиотека задач Microsoft или D std.parallelism?

  • Если GPU-вычисления настолько эффектно эффективны, почему процессоры больше не похожи на графические процессоры?

4b9b3361

Ответ 1

Интересный вопрос. Я исследовал эту проблему, поэтому мой ответ основан на некоторых ссылках и личном опыте.

Какие типы проблем лучше подходят для регулярной многоядерности и какие типы лучше подходят для GPGPU?

Как упоминал @Jared. GPGPU построены для очень регулярных рабочих нагрузок, например, графики, плотной матричной матрицы, простых фильтров для фотошоп и т.д. Они хорошо переносят длительные задержки, потому что они по своей сути предназначены для терпимости к выборке текстур, 1000+ циклов. В ядрах GPU много потоков: когда один поток запускает длительную работу с задержкой (скажем, доступ к памяти), этот поток укладывается в спящий режим (и другие потоки продолжают работать) до завершения операции длительной латентности. Это позволяет GPU сохранять свои исполнительные блоки занятыми намного больше, чем традиционные ядра.

Графические процессоры плохи при обработке веток, потому что графические процессоры любят загружать "потоки" (полосы SIMD, если вы не nVidia), в перекосы и посылать их по конвейеру вместе, чтобы сохранить силу выборки/декодирования команды. Если потоки сталкиваются с веткой, они могут расходиться, например, 2 потока в 8-нитном деформировании могут принимать ветвь, в то время как другая 6 может не принимать ее. Теперь деформация должна быть разделена на две части с размерами 2 и 6. Если ваше ядро ​​имеет 8 SIMD-полос (именно поэтому оригинальная основа разбита на 8 потоков), теперь ваши две вновь сформированные деформации будут работать неэффективно. 2-ниточная деформация будет работать с эффективностью 25%, а шестиконечная деформация будет работать с эффективностью 75%. Вы можете себе представить, что если графический процессор продолжает сталкиваться с вложенными ветвями, его эффективность становится очень низкой. Поэтому графические процессоры не подходят для обработки веток, поэтому код с ветвями не должен запускаться на графических процессорах.

Графические процессоры также являются плохими совместными потоками. Если потоки должны разговаривать друг с другом, тогда графические процессоры не будут работать хорошо, потому что синхронизация не поддерживается на графических процессорах (но nVidia на ней).

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

Каковы основные отличия в модели программирования?

Графические процессоры не поддерживают прерывания и исключение. Для меня это самая большая разница. Кроме того, CUDA не сильно отличается от C. Вы можете написать программу CUDA, в которой вы отправляете код на GPU и запускаете его там. Вы получаете доступ к памяти в CUDA несколько иначе, но опять же, что не является основополагающим для нашего обсуждения.

Каковы основные отличия оборудования, которые требуют каких-либо различий в модели программирования?

Я уже упоминал их. Самым большим является SIMD-характер графических процессоров, который требует, чтобы код был написан очень обычным способом без ветвей и межпоточной связи. Это часть того, почему, например, CUDA ограничивает количество вложенных ветвей в коде.

Какой из них обычно проще в использовании и на сколько?

В зависимости от того, что вы кодируете и какова ваша цель.

Легко векторный код: CPU легче кодировать, но с низкой производительностью. Графический процессор немного сложнее кодировать, но обеспечивает большой взрыв для доллара. Для всех остальных ЦП проще и часто лучше.

Является ли практическим в долгосрочной перспективе реализовать библиотеки высокого уровня parallelism для графического процессора, такие как параллельная библиотека задач Microsoft или D std.parallelism?

Task- parallelism, по определению, требует связи потоков и имеет ветки. Идея задач состоит в том, что разные потоки выполняют разные вещи. Графические процессоры предназначены для множества потоков, которые выполняют одинаковые действия. Я бы не собирал библиотеки задач parallelism для графических процессоров.

Если GPU-вычисления настолько эффектно эффективны, почему процессоры больше не похожи на графические процессоры?

Множество проблем в мире разветвлено и нерегулярно. 1000 примеров. Графические алгоритмы поиска, операционные системы, веб-браузеры и т.д. Просто чтобы добавить - даже графика становится все более разветвленной и универсальной, как и каждое поколение, поэтому графические процессоры станут все больше и больше похожими на процессоры. Я не говорю, что они станут такими же, как процессоры, но они станут более программируемыми. Правильная модель находится где-то между силовыми неэффективными процессорами и очень специализированными GPU.

Ответ 2

Даже в многоядерном процессоре ваши единицы работы будут намного больше, чем на GPGPU. GPGPU подходят для проблем, которые очень хорошо масштабируются, причем каждый кусок работы становится маловероятным. GPGPU имеет гораздо более высокую задержку, потому что вам нужно перенести данные в систему памяти GPU, прежде чем к ней можно будет получить доступ. Однако, как только данные будут там, ваша пропускная способность, если проблема будет соответствующим образом масштабируема, будет намного выше с GPGPU. По моему опыту, проблема с программированием GPGPU - это задержка при получении данных из обычной памяти в GPGPU.

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

Все компьютеры не разработаны, как графические процессоры, потому что графические процессоры являются фантастическими при высоких задержках, вычислениях с высокой пропускной способностью, которые по своей сути параллельны и могут быть легко разбиты. Большая часть того, что делает процессор, по своей сути не параллельна и не очень эффективна для тысяч или миллионов одновременных работников. К счастью, графическое программирование делает и почему все это началось в графических процессорах. Люди все чаще сталкиваются с проблемами, которые могут вызвать проблемы с графикой, что привело к росту программирования GPGPU. Однако программирование GPGPU действительно стоит вашего времени, если оно подходит для вашей проблемной области.