Мне интересно узнать, написал ли кто-нибудь приложение, которое использует GPGPU, используя, например, nVidia CUDA. Если да, то какие проблемы вы обнаружили и какие успехи в производительности вы достигли по сравнению со стандартным процессором?Вы успешно использовали GPGPU?
ответ
Я занимаюсь разработкой gpgpu с ATI's stream SDK вместо Cuda. . Какое усиление производительности вы получите от лот факторов, но наиболее важным является числовая интенсивность. (То есть отношение вычислительных операций к ссылкам на память.)
Функция уровня BLAS уровня 1 или BLAS уровня 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.
Я использую GPGPU для обнаружения движения (первоначально использовал CG, а теперь CUDA) и стабилизацию (используя CUDA) с обработкой изображений. В этих ситуациях я получаю ускорение 10-20X.
Из того, что я читал, это довольно типично для алгоритмов, параллельных данным.
Я написал тривиальные приложения, это действительно помогает, если вы можете рассчитать вычисления с плавающей запятой.
Я нашел следующий курс, назначенный профессором Университета штата Иллинойс Урбана Шампейн и инженером NVIDIA, очень полезным, когда я начинал: http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (включает записи всех лекций).
Отличная ссылка - спасибо. –
Определенно очень хорошая ссылка, но она, кажется, сломана. Вместо этого попробуйте http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html. –
Ссылка, похоже, истекло – ccook
Пока у меня еще нет практического опыта работы с CUDA, я изучал этот вопрос и нашел ряд документов, которые документируют положительные результаты с использованием API GPGPU (все они включают CUDA).
В этом paper описано, как объединения баз данных можно парализовать, создав ряд параллельных примитивов (карту, разброс, сборку и т. Д.), Которые можно объединить в эффективный алгоритм.
В этом paper параллельная реализация стандарта шифрования AES создается с сопоставимой скоростью для скрытого шифрования.
Наконец, этот paper анализирует, насколько хорошо CUDA применяется к ряду приложений, таких как структурированные и неструктурированные сетки, комбинированная логика, динамическое программирование и интеллектуальный анализ данных.
Я внедрил расчет Монте-Карло в CUDA для некоторого финансового использования. Оптимизированный код CUDA примерно в 500 раз быстрее, чем «может потребоваться более сложная, но не совсем» многопоточная реализация ЦП. (Сравнение GeForce 8800GT с Q6600 здесь). Хорошо известно, что проблемы Монте-Карло неловко параллельны.
Основные проблемы, с которыми приходится сталкиваться, связаны с потерей точности из-за ограничений чипа G8x и G9x для чисел с плавающей точкой с одиночной точностью IEEE. С выпуском чипов GT200 это может быть смягчено в некоторой степени с помощью блока двойной точности за счет некоторой производительности. Я еще не пробовал.
Кроме того, поскольку CUDA является расширением C, интеграция его в другое приложение может быть нетривиальной.
Я не думаю, что это сложно вообще интегрировать. В конце концов, с простым «внешним» C »это просто стандартная связь C-стиля. Большинство вещей должно быть в состоянии справиться с этим. Прошло менее 20 минут, чтобы выполнить быстрый тест, связанный с приложением Qt. (После того, как вы установили SDK и скомпилировали образцы, в любом случае) Если вы имеете в виду управляемый код ... ну ... IMHO квадратный круглый дыр. – darron
Я использовал CUDA несколько алгоритмов обработки изображения. Эти приложения, конечно, очень хорошо подходят для CUDA (или любой парадигмы обработки GPU).
ИМО, Есть три типичных этапов при переносе алгоритм CUDA:
- Initial Сверловка: Даже с очень базовыми знаниями CUDA, вы можете порт простых алгоритмов в течение нескольких часов. Если вам повезет, вы получаете коэффициент от 2 до 10 в производительности.
- Тривиальные оптимизации: Сюда входят текстуры для ввода данных и заполнение многомерных массивов. Если вы опытны, это можно сделать в течение дня и может дать вам еще один показатель в 10 баллов. Полученный код все еще доступен для чтения.
- Hardcore Optimizations: Это включает в себя копирование данных в общую память, чтобы избежать задержек в глобальной памяти, превращая код наизнанку, чтобы уменьшить количество используемых регистров и т. Д. Вы можете провести несколько недель с этого шага, но прирост производительности на самом деле это не стоит в большинстве случаев. После этого шага ваш код будет настолько запутанным, что его никто не поймет (включая вас).
Это очень похоже на оптимизацию кода для процессоров. Однако ответ GPU на оптимизацию производительности еще менее предсказуем, чем для процессоров.
Я согласен с этими шагами. Тем не менее, первый шаг должен иметь особую осторожность, поскольку, если вы выполняете слишком много условностей или зацикливаете на ядрах и не анализируете свою проблему в первую очередь (если она хорошо подходит для параллельной работы в этой реализации), вы не будете удачи –
Это также имитирует мой опыт. Я знал, что моя проблема (n-тело) будет параллельна. Тривиальная реализация не так долго выполнялась и была на x10 быстрее, чем реализация на C++ на процессоре i7 920. Переосмысление alrogithm для более эффективного использования разделяемой памяти и т. Д. Уже дало мне 3-4-кратное ускорение, но требовало гораздо большего. –
+1 для «никто не понимает (включая вас)». –
Да. Я применил Nonlinear Anisotropic Diffusion Filter, используя CUDA api.
Это довольно просто, так как это фильтр, который должен запускаться параллельно с учетом входного изображения. На этом я не сталкивался с множеством трудностей, поскольку требовалось простое ядро. Ускорение было примерно в 300 раз. Это был мой последний проект по CS. Проект можно найти here (он написан на португальском языке).
Я тоже пробовал написать алгоритм сегментации Mumford&Shah, но это было больно писать, поскольку CUDA все еще в начале и так много странных вещей. Я даже видел улучшение производительности, добавив if (false){}
в код O_O.
Результаты для этого алгоритма сегментации не были хорошими.У меня была потеря производительности в 20 раз по сравнению с подходом к процессору (однако, поскольку это процессор, можно использовать другой подход, который позволил бы добиться тех же результатов). Это по-прежнему продолжается, но, к сожалению, я покинул лабораторию, над которой работал, поэтому, возможно, когда-нибудь я смогу закончить ее.
Я реализовал генетический алгоритм на графическом процессоре и получил ускорение около 7 .. Больше выигрышей возможны с более высокой численной интенсивностью, как указал кто-то другой. Так что да, прибыль там, если приложение правильное
Я реализовал Cholesky Factorization для решения большого линейного уравнения на графическом процессоре с использованием ATI Stream SDK. Мои наблюдения были
Got производительность убыстрение ДО 10 раз.
Работая над той же проблемой, чтобы ее оптимизировать, масштабируя ее до нескольких графических процессоров.
Каковы оси X и Y? –
размер проблемы и ускорение :) –
Я написал комплексное ядро матричного умножения, которое било реализацию cuBLAS примерно на 30% для приложения, для которого я его использовал, и своего рода векторную внешнюю функцию продукта, которая выполнялась на несколько порядков, чем решение с несколькими трассировками для остальной части проблемы.
Это был последний проект года. Мне понадобился целый год.
В чем преимущество использования ATI над CUDA для математики с плавающей запятой? Я думал, что CUDA лучше. –