Почему мы все еще используем процессоры вместо графических процессоров?
=======================================================================

Мне кажется, что в наши дни много вычислений делается на GPU. Очевидно, что графика выполняется там, но с использованием CUDA и тому подобного, AI, алгоритмов хеширования (например, биткойнов) и других также выполняются на GPU. Почему мы не можем просто избавиться от процессора и использовать его самостоятельно? Что делает GPU намного быстрее, чем процессор?

**Ответ TL;DR: у** графических процессоров гораздо больше процессорных ядер, чем у процессоров, но поскольку каждое ядро графического процессора работает значительно медленнее, чем ядро процессора, и не обладает функциями, необходимыми для современных операционных систем, они не подходят для выполнения большей части обработки в повседневной жизни. вычисления. Они больше всего подходят для вычислительных операций, таких как обработка видео и физическое моделирование.

---

 [GPGPU](https://en.wikipedia.org/wiki/GPGPU) - все еще относительно новая концепция. Графические процессоры изначально использовались только для визуализации графики; По мере развития технологии большое количество ядер в графических процессорах по сравнению с процессорами использовалось для разработки вычислительных возможностей для графических процессоров, чтобы они могли обрабатывать множество параллельных потоков данных одновременно, независимо от того, какими могут быть эти данные. Хотя графические процессоры могут иметь сотни или даже тысячи потоковых процессоров, каждый из них работает медленнее, чем ядро процессора, и обладает меньшим количеством функций (даже если они [завершены по Тьюрингу](https://en.wikipedia.org/wiki/Turing_completeness) и могут быть запрограммированы для запуска любой программы, которую может запустить процессор). Функции, отсутствующие в графических процессорах, включают прерывания и виртуальную память, которые необходимы для реализации современной операционной системы.

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

 .detail-content-adblock { width: 336px; height: 280px; }
 @media(min-width: 768px) { .detail-content-adblock { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .detail-content-adblock { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .detail-content-adblock { width: 728px; height: 90px; } }
 

 (adsbygoogle = window.adsbygoogle || []).push({});
 

В результате, графические процессоры не подходят для выполнения задач, которые не приносят существенной выгоды или не могут быть распараллелены, включая многие распространенные потребительские приложения, такие как текстовые процессоры. Кроме того, графические процессоры используют принципиально другую архитектуру; для его работы нужно было бы запрограммировать приложение специально для графического процессора, и для программирования графических процессоров требуются существенно разные методы. Эти различные методы включают новые языки программирования, модификации существующих языков и новые парадигмы программирования, которые лучше подходят для выражения вычислений в виде параллельной операции, выполняемой многими потоковыми процессорами. Для получения дополнительной информации о методах, необходимых для программирования графических процессоров, см. Статьи Википедии о [потоковой обработке](https://en.wikipedia.org/wiki/Stream_processing) и [параллельных вычислениях](https://en.wikipedia.org/wiki/Parallel_computing).

Современные графические процессоры способны выполнять векторные операции и арифметику с плавающей запятой, а новейшие карты способны манипулировать числами с плавающей запятой двойной точности. Фреймворки, такие как CUDA и OpenCL, позволяют писать программы для графических процессоров, а природа графических процессоров делает их наиболее подходящими для высокопараллелизируемых операций, например, в научных вычислениях, где серия специализированных вычислительных карт на графических процессорах может быть жизнеспособной заменой для небольших вычислительный кластер, как в [NVIDIA Tesla Personal Supercomputers](https://www.nvidia.com/object/personal-supercomputing.html). Потребители с современными графическими процессорами, которые имеют опыт работы с Folding @ home, могут использовать их для взаимодействия с [клиентами графических процессоров](http://folding.stanford.edu/English/DownloadWinOther), которые могут выполнять моделирование свертывания белка на очень высоких скоростях и вносить больше работы в проект (сначала обязательно прочитайте [часто задаваемые вопросы](http://folding.stanford.edu/English/FAQ), особенно связанные с GPU). Графические процессоры также могут обеспечить лучшее физическое моделирование в видеоиграх с использованием PhysX, ускорить кодирование и декодирование видео и выполнять другие задачи, требующие больших вычислительных ресурсов. Именно эти типы задач наиболее подходят для выполнения графических процессоров.

AMD является пионером в разработке процессоров, называемых [ускоренным процессором (APU)](https://www.amd.com/us/products/technologies/apu/Pages/apu.aspx), который сочетает в себе обычные процессорные ядра x86 с графическими процессорами. Этот подход обеспечивает графическую производительность, значительно превосходящую встроенные в материнскую плату графические решения (хотя и не подходит для более дорогих дискретных графических процессоров), и позволяет создать компактную недорогую систему с хорошей производительностью мультимедиа без необходимости использования отдельного графического процессора. Новейшие процессоры Intel также предлагают встроенную встроенную графику, хотя конкурентоспособная производительность интегрированного графического процессора в настоящее время ограничена несколькими чипами с Intel Iris Pro Graphics. Поскольку технология продолжает развиваться, мы увидим растущую степень сближения этих некогда отдельных частей. AMD предвидит [будущее, в котором процессоры и графические процессоры - это одно целое, способное беспрепятственно работать вместе над одной задачей](http://developer.amd.com/resources/heterogeneous-computing/what-is-heterogeneous-system-architecture-hsa/).

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

 .detail-content-adblock { width: 336px; height: 280px; }
 @media(min-width: 768px) { .detail-content-adblock { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .detail-content-adblock { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .detail-content-adblock { width: 728px; height: 90px; } }
 

 (adsbygoogle = window.adsbygoogle || []).push({});
 



>  Что делает GPU намного быстрее, чем процессор? 
> 
> 

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

 Графический процессор представляет собой специализированный процессор, разработанный таким образом, чтобы одна команда работала с большим блоком данных (SIMD / Single Instruction Multiple Data), причем все они применяли одну и ту же операцию. Работа с блоками данных, безусловно, более эффективна, чем работа с одной ячейкой за раз, поскольку при декодировании инструкций значительно сокращаются издержки, однако работа с большими блоками означает, что имеется больше параллельных рабочих блоков, поэтому в ней используется гораздо больше транзисторов. реализовать одну инструкцию GPU (вызывая ограничение физического размера, используя больше энергии и выделяя больше тепла). 

 .detail-content-adblock { width: 336px; height: 280px; }
 @media(min-width: 768px) { .detail-content-adblock { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .detail-content-adblock { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .detail-content-adblock { width: 728px; height: 90px; } }
 

 (adsbygoogle = window.adsbygoogle || []).push({});
 

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

 Причина, по которой мы все еще используем CPU, **не в том,** что x86 является королем архитектуры CPU, а Windows написана для x86, а причина, по которой мы все еще используем CPU, в том, что тип задач, которые должна выполнять ОС, то есть принятие решений, работает более эффективно на архитектуре процессора. Операционная система должна смотреть на сотни различных типов данных и принимать различные решения, которые все зависят друг от друга; Такая работа не может быть легко распараллелена, по крайней мере, в архитектуру SIMD. 

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



Отсутствие графических процессоров:

1. Виртуальная память (!!!)
2. Средства адресации устройств, отличных от памяти (например, клавиатуры, принтеры, дополнительное хранилище и т. Д.)
3. Прерывания

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

 .detail-content-adblock { width: 336px; height: 280px; }
 @media(min-width: 768px) { .detail-content-adblock { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .detail-content-adblock { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .detail-content-adblock { width: 728px; height: 90px; } }
 

 (adsbygoogle = window.adsbygoogle || []).push({});
 

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

**РЕДАКТИРОВАТЬ**: Обратите внимание, что этот ответ был написан в 2011 году - технология графических процессоров постоянно меняется. Вещи могут быть очень разными в зависимости от того, когда вы читаете это: P

* Некоторые графические процессоры не медленны в арифметике с двойной точностью, например, линии NVidia Quadro или Tesla (поколение Fermi или новее) или линия AMD FirePro (поколение GCN или новее). Но это не в машинах большинства потребителей.

 .detail-content-adblock { width: 336px; height: 280px; }
 @media(min-width: 768px) { .detail-content-adblock { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .detail-content-adblock { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .detail-content-adblock { width: 728px; height: 90px; } }
 

 (adsbygoogle = window.adsbygoogle || []).push({});
 



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

Что бы вы предпочли в качестве вашего коллеги-разработчика, одного суперскоростного парня или 100 быстрых клонов, которые на самом деле не такие быстрые, но все должны выполнять одни и те же действия одновременно?

Для некоторых действий клоны довольно хороши, например, подметать пол - каждый может подмести его часть.

Для некоторых действий клоны воняют, например, пишут еженедельный отчет - все клоны, кроме одного, простаивают, а один клон пишет отчет (в противном случае вы просто получаете 100 копий одного и того же отчета).

 .detail-content-adblock { width: 336px; height: 280px; }
 @media(min-width: 768px) { .detail-content-adblock { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .detail-content-adblock { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .detail-content-adblock { width: 728px; height: 90px; } }
 

 (adsbygoogle = window.adsbygoogle || []).push({});
 



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

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

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

Небольшое замечание: если бы можно было утилизировать процессор и иметь только графический процессор, не думаете ли вы, что мы его переименуем?:)



Вы действительно спрашиваете, **почему мы не используем GPU-подобные архитектуры в CPU?**

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

На самом деле мы используем разные (более графические) архитектуры ЦП. Например, процессоры [Niagara](https://en.wikipedia.org/wiki/UltraSPARC_T2) довольно многозадачны. [SPARC T3](https://en.wikipedia.org/wiki/SPARC_T3) будет работать 512 одновременных потоков.



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

* Я считаю, что каждое исполнительное устройство GPU ("ядро") имеет очень ограниченное адресное пространство по сравнению с процессором.
* Исполнительные блоки GPU не могут эффективно справляться с ветвлением.
* Исполнительные блоки GPU не поддерживают аппаратные прерывания так же, как CPU.

Я всегда думал, что то, каким должны быть исполнительные блоки GPU, это что-то вроде "SPE" для Playstation 3, они хотят получить блок данных, выполнить ряд последовательных операций над ним, а затем выплюнуть еще один блок данные, промыть, повторить. У них не так много адресуемой памяти, как у основного "CPE", но идея состоит в том, чтобы посвятить каждый "SPE" определенной, последовательной задаче. Выход одного блока может питать вход другого блока.

Исполнительные блоки не работают хорошо, если они пытаются "проанализировать" данные и принять кучу решений, основанных на том, что это за данные.

Эти "блоки данных" могут быть частью потока, например, список вершин из таблицы состояний игры, данные MPEG с диска и т. Д.

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



Это не имеет **ничего общего с** тактовой частотой или целью. Они оба одинаково способны выполнять большинство, если не все задачи; однако некоторые из них лучше подходят для некоторых задач, чем другие.

Был **очень** старый спор о том, лучше ли иметь много тупых ядер или небольшую группу очень умных ядер. Это легко восходит к 80-м годам.

Внутри процессора есть много возможных расчетов, которые можно сделать. Более умные ядра могут выполнять много разных вычислений одновременно (вроде как многоядерные, но не сложные, см. [Параллелизм на уровне команд](https://en.wikipedia.org/wiki/Instruction-level_parallelism)). Интеллектуальное ядро может выполнять несколько вычислений одновременно (сложение, вычитание, умножение, деление, операции с памятью), но только по одному за раз; из-за этого они физически больше (и, следовательно, намного дороже), чем более тупые ядра.

Тупое ядро намного меньше, и поэтому к одному чипу можно добавить больше, но не в состоянии выполнить столько же одновременных вычислений. Существует хороший баланс между многими тупыми ядрами и несколькими умными ядрами.

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

Это **гораздо** более сложный вопрос, чем может показаться. Для получения дополнительной информации, прочитайте эту статью о дизайне процессора:

> Современные микропроцессоры - руководство за 90 минут
> 
>  <http://www.lighterra.com/papers/modernmicroprocessors/>
> 
> 



Я хотел бы затронуть один синтаксический момент: термины CPU и GPU являются функциональными именами, а не архитектурными.

Если бы компьютер использовал графический процессор в качестве основного процессора, он стал бы "центральным процессором" (ЦП) независимо от архитектуры и дизайна.



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

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

Большинство изящных приемов, которые использовались для того, чтобы заставить GPU выполнять свою работу очень быстро, были впервые разработаны людьми, пытающимися сделать процессоры более быстрыми и качественными. Оказывается, что Word, Excel, Netscape и многие другие вещи, для которых люди используют свои компьютеры, не только не в полной мере используют возможности, предлагаемые специализированными графическими чипами, но даже работают *медленнее* на этих архитектурах, потому что ветвление часто (очень дорого) и медленно) трубопровод очищает.



Весь смысл существования графического процессора состоял в том, чтобы избавить процессор от дорогостоящих графических вычислений, которые он делал в то время.  
Снова объединяя их в один процессор, мы вернемся к тому, с чего все началось.



По простой причине: большинство приложений не являются многопоточными / векторизованными.

Графические карты в значительной степени полагаются на многопоточность, по крайней мере, в концепции.

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

Однако с AMD Fusion это изменит то, как нам потребуется использовать вычислительную мощность: либо векторизованное, либо быстрое для одного потока.



Причина, по которой мы все еще используем процессоры, заключается в том, что как процессоры, так и графические процессоры имеют свои уникальные преимущества. См. Мой следующий документ, принятый в ACM Computing Surveys 2015, в котором содержится исчерпывающая и исчерпывающая дискуссия о переходе от "дискуссии о CPU к GPU" к "совместным вычислениям CPU-GPU".

 [Обзор методов гетерогенных вычислений CPU-GPU](https://www.academia.edu/12355899/A_Survey_of_CPU-GPU_Heterogeneous_Computing_Techniques)



gpus - хорошие потоковые процессоры. Вы можете думать об обработке потока как о последовательном умножении длинного массива чисел. Процессоры также имеют возможности потоковой обработки (это называется расширениями SIMD), но вы не можете реализовать всю логику программирования как потоковую обработку, и у компиляторов есть возможность создавать btyecode, который по возможности использует команды simd.

не все это массив чисел. картинки и видео, возможно, тоже звучат (тут и там есть кодеры opencl). таким образом, gpus может обрабатывать, кодировать и декодировать изображения, видео и что-либо подобное. один недостаток заключается в том, что вы не можете разгрузить все в gpus в играх, потому что это может вызвать заикание, gpus занят графикой и, как предполагается, является узким местом в системе при игре в игры. оптимальным решением будет полное использование всех компонентов на компьютере. так, например, движок nvidia Physx по умолчанию выполняет вычисления на процессоре, когда он полностью загружен.



Если поставить просто GPU, то можно сравнить с прицепом в автомобиле. Как правило, багажника достаточно для большинства людей, за исключением случаев, когда они покупают что-то действительно большое. Тогда им может понадобиться трейлер. То же самое с GPU, как обычно достаточно иметь обычный CPU, который будет выполнять большинство задач. Но если вам нужны интенсивные вычисления во многих потоках, тогда вам может потребоваться графический процессор