Почему алгоритмы на основе GPU работают быстрее - PullRequest
4 голосов
/ 11 февраля 2012

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

Мне любопытно, ПОЧЕМУ реализация на основе графического процессора работает быстрее. Обратите внимание, что мне известны поверхностные соображения о том, что графический процессор имеет несколько ядер и, следовательно, может выполнять параллельную операцию, то есть вместо последовательного посещения каждого индекса мы можем назначить поток для вычисления разницы для каждого индекса.

Но может кто-нибудь сказать мне более глубокую причину того, почему графические процессоры работают быстрее. Что такого особенного в их архитектуре, что они могут превзойти реализацию на базе процессора

Ответы [ 3 ]

5 голосов
/ 11 февраля 2012

Обычно они не работают быстрее.

Дело в том, что некоторые алгоритмы лучше вписываются в процессор, другие лучше вписываются в графический процессор.

Модель исполнения графических процессоров отличается (см. SIMD), модель памяти отличается, набор команд отличается ... Вся архитектура отличается.

Нет очевидного способа сравнить процессор с графическим процессором. Вы можете только обсудить, является ли (и почему) реализация A алгоритма процессором быстрее или медленнее, чем реализация B этого алгоритма на графическом процессоре.


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

4 голосов
/ 11 февраля 2012

Реальная причина в том, что графический процессор не только имеет несколько ядер, но и много ядер , обычно их сотни! Однако каждое ядро ​​графического процессора намного медленнее, чем низкоуровневое.

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

2 голосов
/ 18 декабря 2012

Хотя некоторые ответы уже были даны здесь, и это старая ветка, я просто подумал, что добавлю это для потомков, а что нет:

Основная причина того, что процессоры и графические процессоры сильно различаются по производительности для определенных задач, заключается в проектных решениях, касающихся распределения ресурсов чипа. Процессоры отводят большую часть своего чипового пространства большим кэшам, декодерам команд, управлению периферийными устройствами и системами и т. Д. Их ядра намного сложнее и работают на гораздо более высоких тактовых частотах (что выделяет больше тепла на ядро, которое должно рассеиваться). Графические процессоры выделяют свое чиповое пространство для упаковки на чип такого количества ALU с плавающей запятой, насколько это возможно. Первоначальная цель графических процессоров состояла в том, чтобы как можно быстрее умножать матрицы (потому что это основной тип вычислений, используемых при визуализации графики). Поскольку умножение матриц представляет собой смущающе параллельную проблему (например, каждое выходное значение вычисляется полностью независимо от любого другого выходного значения). ) и путь кода для каждого из этих вычислений идентичен, пространство чипа можно сэкономить, если несколько ALU следуют инструкциям, декодированным одним декодером команд, поскольку все они выполняют одни и те же операции в одно и то же время. Напротив, каждое из ядер ЦП должно иметь свой собственный отдельный декодер команд, поскольку ядра не следуют одинаковым путям кода, что делает каждое из ядер ЦП на кристалле намного больше, чем ядра ГП. Поскольку первичные вычисления, выполняемые в матричном умножении, представляют собой умножение с плавающей запятой и сложение с плавающей запятой, графические процессоры реализованы таким образом, что каждая из них является операцией с одним циклом и, фактически, даже содержит слитую команду умножения и сложения, которая умножает два номера и добавляет результат к третьему числу в одном цикле. Это намного быстрее, чем типичный процессор, где умножение с плавающей запятой часто является многоцикловой операцией. Опять же, компромисс здесь заключается в том, что пространство микросхемы отведено математическому оборудованию с плавающей запятой, а другие инструкции (такие как поток управления) часто выполняются намного медленнее на ядро, чем на процессоре, а иногда даже просто не существуют на GPU вообще.

Кроме того, поскольку ядра GPU работают на гораздо более низких тактовых частотах, чем обычные ядра ЦП, и не содержат столь сложной схемы, они не выделяют столько тепла на ядро ​​(или не используют столько энергии на ядро). Это позволяет большее количество из них может быть упаковано в одно и то же пространство без перегрева чипа, а также позволяет GPU с 1000+ ядрами иметь такие же требования к питанию и охлаждению, что и CPU с 4 или 8 ядрами.

...