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

Вы успешно использовали GPGPU?

Мне интересно узнать, написал ли кто-нибудь приложение, которое использует GPGPU, используя, например, nVidia CUDA. Если да, то какие проблемы вы обнаружили и какие успехи в производительности вы достигли по сравнению со стандартным процессором?

4b9b3361

Ответ 1

Я занимаюсь разработкой gpgpu с ATI stream SDK вместо Cuda. Какое усиление производительности вы получите, зависит от фактора лота, но наиболее важным является числовая интенсивность. (То есть отношение вычислительных операций к ссылкам на память.)

Функция BLAS level-1 или BLAS level-2, такая как добавление двух векторов, выполняет только 1 математическую операцию для каждой 3 ссылок памяти, поэтому NI (1/3). Это всегда работает медленнее с CAL или Cuda, чем просто на процессоре. Основная причина - время, необходимое для передачи данных из процессора в gpu и обратно.

Для такой функции, как FFT, существуют O (N log N) вычисления и O (N) ссылки на память, поэтому NI - O (log N). Если N очень велико, скажем, 1 000 000, скорее всего, будет быстрее сделать это на gpu; Если N мало, скажем, 1000, это почти наверняка будет медленнее.

Для функции BLAS уровня 3 или LAPACK, такой как LU-декомпозиция матрицы или нахождения ее собственных значений, имеются вычисления O (N ^ 3) и ссылки на O (N ^ 2) памяти, поэтому NI является O (N). Для очень малых массивов, скажем, N - это несколько баллов, это все равно будет быстрее делать на процессоре, но по мере увеличения N алгоритм очень быстро переходит из привязанного к памяти к вычислению, а увеличение производительности на gpu очень сильно возрастает быстро.

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

http://home.earthlink.net/~mtie/CGEMM%20081121.gif

Вот производительность CGEMM - комплексного одноточечного матрично-матричного умножения, выполненного на Radeon 4870.

Ответ 2

Я написал тривиальные приложения, это действительно помогает, если вы можете рассчитать вычисления с плавающей запятой.

Я нашел следующий курс обучения Университета штата Иллинойс Урбана Шампейн, а инженер NVIDIA очень полезен, когда я начинал: http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (включает записи всех лекций).

Ответ 3

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

IMO, при переносе алгоритма в CUDA существует три типичных этапа:

  • Начальная посылка: Даже имея очень базовые знания CUDA, вы можете переносить простые алгоритмы в течение нескольких часов. Если вам повезет, вы получаете коэффициент от 2 до 10 в производительности.
  • Тривиальные оптимизации: Это включает в себя использование текстур для ввода данных и заполнение многомерных массивов. Если вы опытны, это можно сделать в течение дня и может дать вам еще один показатель в 10 баллов. Полученный код все еще доступен для чтения.
  • Оптимизация жесткого диска:. Это включает в себя копирование данных в общую память, чтобы избежать задержек в глобальной памяти, вывертывание кода наизнанку для уменьшения количества используемых регистров и т.д. Вы можете провести несколько недель с этого шага, но прирост производительности на самом деле не стоит в большинстве случаев. После этого шага ваш код будет настолько запутанным, что его никто не понимает (включая вас).

Это очень похоже на оптимизацию кода для процессоров. Однако ответ GPU на оптимизацию производительности еще менее предсказуем, чем для процессоров.

Ответ 4

Я использую GPGPU для обнаружения движения (сначала используя CG, а теперь CUDA) и стабилизацию (используя CUDA) с обработкой изображений. В этих ситуациях я получаю ускорение 10-20X.

Из того, что я прочитал, это довольно типично для алгоритмов, параллельных данным.

Ответ 5

Пока у меня еще нет практического опыта работы с CUDA, я изучал этот вопрос и нашел ряд документов, которые документируют положительные результаты с использованием API GPGPU (все они включают CUDA).

Этот paper описывает, как объединения баз данных можно парализовать, создав ряд параллельных примитивов (отображение, разброс, сбор и т.д.), которые могут быть объединены в эффективный алгоритм.

В этой документе, параллельная реализация стандарта шифрования AES создается со сравнимой скоростью с дискретным оборудованием шифрования.

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

Ответ 6

Я реализовал расчет Монте-Карло в CUDA для некоторого финансового использования. Оптимизированный код CUDA примерно в 500 раз быстрее, чем "может потребоваться более сложная, но не совсем" многопоточная реализация ЦП. (Сравнение GeForce 8800GT с Q6600 здесь). Хорошо известно, что проблемы Монте-Карло неловко параллельны, хотя.

Основные возникающие проблемы связаны с потерей точности из-за ограничений на чип G8x и G9x для чисел с плавающей точкой с одиночной точностью IEEE. С выпуском чипов GT200 это может быть смягчено в некоторой степени с помощью блока двойной точности за счет некоторой производительности. Я еще не пробовал.

Кроме того, поскольку CUDA является расширением C, интеграция его в другое приложение может быть нетривиальной.

Ответ 7

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

Ответ 8

Я реализовал Cholesky Factorization для решения большого линейного уравнения на GPU с использованием ATI Stream SDK. Мои наблюдения были

alt text

Увеличена производительность до 10 раз.

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

Ответ 9

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

Это был последний проект года. Мне потребовался целый год.

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

Ответ 10

Да. Я внедрил Нелинейный анизотропный диффузионный фильтр, используя CUDA api.

Это довольно легко, так как это фильтр, который должен запускаться параллельно с учетом входного изображения. На этом я не сталкивался с множеством трудностей, поскольку требовалось простое ядро. Ускорение было примерно в 300 раз. Это был мой последний проект по CS. Проект можно найти здесь (он написан на португальском языке).

Я пробовал написать алгоритм сегментации Mumford & Shah, но это было больно писать, поскольку CUDA все еще находится в начало и так много странных вещей. Я даже видел улучшение производительности, добавив if (false){} в код O_O.

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