Производительность графического процессора против производительности процессора для распространенных алгоритмов [закрыто]

StackOverflow https://stackoverflow.com/questions/1415679

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Спасибо!

Это было полезно?

Решение

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

Другие советы

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

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

Другим часто цитируемым примером является запуск SETI@HOME на графическом процессоре Nvidia но это сравнение яблок с апельсинами.Единицы работы для графических процессоров отличаются (и сильно ограничены) по сравнению с тем, что обычно выполняют процессоры.

Взгляните на толчок:

Thrust - это библиотека параллельных алгоритмов CUDA с интерфейсом напоминающим стандартный шаблон C ++ Библиотека (STL).Thrust предоставляет гибкий высокоуровневый интерфейс для графического процессора программирование, которое значительно повышает производительность разработчика.

БУДЬТЕ ОСТОРОЖНЫ, ОЧЕНЬ ОСТОРОЖНЫ с любыми показателями производительности, указанными для GPGPU.Многим людям нравится публиковать действительно впечатляющие цифры, которые не учитывают время передачи, необходимое для передачи входных данных с центрального процессора на графический и выходных данных обратно, поскольку и то, и другое является узким местом PCIe.

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

Изменение размера jpeg-изображения размером 2600 x 2000 дюймов размером 2 МБ (до 512x512) в формате jpeg заняло 23,5 миллисекунды в C # с параметрами абсолютного низкого качества и выборкой ближайшего соседа.Используемая функция была graphics.DrawImage() основанный один.Загрузка процессора также составила 21,5%.

Извлечение "массива байтов rgba" на стороне C # и отправка его на графический процессор, изменение размера в графическом процессоре и получение результатов обратно в изображение заняло 6,3 миллисекунды, а загрузка процессора составила 12,7%.Это было сделано с использованием на 55% более дешевого графического процессора всего с 320 ядрами.

Всего 3,73 кратный множитель ускорения.

Ограничивающим фактором здесь была отправка извлеченных 20 МБ данных rgb (jpeg - всего 2 МБ!) на графический процессор.Эта трудоемкая часть составила почти 90% от общего времени, включая извлечение массива байтов на стороне C #!Так что я предполагаю, что ускорение было бы примерно в 30 раз, по крайней мере, если бы часть извлечения можно было выполнять и в GPU.

30X - это неплохо.

Затем вы могли бы объединить слой извлечения со слоем изменения размера, чтобы скрыть задержку копирования в память и получить еще большую скорость!Это может быть 40X-50X.

Затем увеличьте качество выборки (например, бикубическую вместо ближайшего соседа), у вас будет еще больше преимуществ на стороне графического процессора.Добавление фильтра Гаусса 5x5 добавило всего 0,77 миллисекунды.Кроме того, процессор получит несколько большее время, особенно если необходимые параметры Гаусса отличаются от C#.Net реализация.


Даже если вас не устраивает коэффициент ускорения, разгрузка на GPU и наличие "свободного ядра" на CPU по-прежнему выгодны для того, чтобы перенести больше работы на этот сервер.

Теперь добавьте факт уровней энергопотребления графического процессора (30 Вт против 125 Вт в этом примере), это намного выгоднее.


Процессор вряд ли смог бы победить в

 C[i]=A[i]+B[i]

тесты, когда обе стороны работают с оптимизированными кодами, и вы все еще можете выгрузить половину массивов на GPU и закончить быстрее, используя CPU + GPU одновременно.


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top