Различия CPU и GPU

в чем разница между единым процессором CPU и единым процессором GPU?
Большинство мест, с которыми я сталкивался в интернете, охватывают высокие различия между ними. Я хочу знать, какие инструкции может выполнять каждый из них, насколько они быстры и как эти процессоры интегрированы в архитектуру compete?
Похоже на вопрос с длинным ответом. Так что много ссылок в порядке.

edit:
в CPU, FPU выполняет операции реального числа. Как быстро выполняются одни и те же операции в каждом ядре GPU? Если быстро, то почему быстро?
Я знаю, что мой вопрос очень общий, но моя цель-получить ответы на такие вопросы.

3 ответов


короткий ответ:

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

подробный ответ!--1-->

часть вопроса задает

в CPU FPU выполняет операции с реальным числом. Как быстро такие же операции, выполняемые в каждом ядре GPU? Если быстро тогда почему это быстро?

это относится к единицам выполнения с плавающей запятой (FP), которые используются в процессорах и графических процессорах. The главное отличие is не как реализуется один блок выполнения FP. Скорее разница в том, что ядро CPU будет иметь только несколько единиц выполнения FP, которые работают на независимые инструкции, в то время как GPU будет иметь сотни из них, которые работают на независимые данные параллельно.

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

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

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

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


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

на NVIDIA GPU у вас есть работа, организованная в warps, которая не отделима, то есть группа "ядер" CUDA будет работать с одной и той же инструкцией по некоторым данным, потенциально не выполняя эту инструкцию - размер warp составляет 32 записи. Это понятие warp очень похоже на SIMD инструкции процессоров, которые имеют возможность SSE (2 или 4 записи) или AVX (4 или 8 записей). Операции AVX также будут работать с группой значений, и разные "полосы" этой векторной единицы не могут выполнять разные операции одновременно.

CUDA называется SIMT, поскольку на "потоках" CUDA немного больше гибкости, чем на "полосах"AVX. Однако концептуально это похоже. По сути, понятие предиката будет указывать, должны ли операции выполняться на некоторых CUDA "core". AVX предлагает маскированные операции на своей полосе, чтобы предложить подобное поведение. Чтение и запись в память также отличаются, поскольку GPU реализует как сбор, так и разброс, где только процессоры AVX2 собираются, а разброс запланирован исключительно для AVX-512.

рассматривает "один процессор" с такой аналогией будет означать единой технологии CUDA "сердечника", или один с AVX "переулок", например. В этом случае они очень похожи. На практике оба работают add, sub, mul, fma в одном цикл (пропускная способность, задержка может сильно отличаться), в соответствии с нормой IEEE, с точностью 32 бит или 64 бит. Обратите внимание, что количество "ядер" CUDA двойной точности будет отличаться от устройств gamer (a.к. a. GeForce) в Tesla solutions. Кроме того, частота каждого типа FPU отличается: дискретные графические процессоры перемещаются в диапазоне 1 ГГц, где процессоры больше в 2.x-3.диапазон xGHz.

наконец, графические процессоры имеют специальный функциональный блок который способен вычислять грубое аппроксимация некоторых трансцендентных функций из стандартной математической библиотеки. Эти функции, некоторые из которых также реализованы в AVX, LRBNi и AVX-512, работают намного лучше, чем точные аналоги. Норма IEEE не является строгой для большинства функций, поэтому позволяет различные реализации, но это больше тема компилятора/компоновщика.


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

процессор, однако, предназначен для выполнения последовательных приложений с небольшим или нет многопоточность. Современные процессоры часто имеют 2-8 ядер, тактовая частота которых превышает 3-4 ГГц.

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

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