Существуют ли известные проблемы / алгоритмы в научных вычислениях, которые нельзя ускорить распараллеливанием?

27

Существуют ли какие-либо известные проблемы / алгоритмы в научных вычислениях, которые нельзя ускорить распараллеливанием? Во время чтения книг по CUDA мне кажется, что большинство вещей может быть.

RNs_Ghost
источник
Двоичный поиск не может быть ускорен (значительно, т.е. фактором) даже при рассмотрении иерархии памяти.
Алгоритм Грамма Шмидта: en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process
3
@Anycorn Нет, левый классический Грам-Шмидт и правый модифицированный Грам-Шмидт хорошо работают параллельно. Есть много других параллельных алгоритмов QR, включая недавно популярный TSQR.
Джед Браун
@ Рафаэль: Я думаю, что возможно ускорить бинарный поиск с помощью фактора log (n), n = # процессоров. Вместо того, чтобы делить интервал поиска на части и проверять, где продолжить, разделите интервал на n частей. Возможно, есть более эффективные способы, я не знаю.
miracle173

Ответы:

32

CTCTCTTNClogT

Примеры

  • C=T
  • m×mT=N=O(m2)C=m=T
  • T=NC=logT
  • τ(0,1)dk=τ/ΔtτN1/dC=kT=kN=τN(d+1)/dP=T/C=NN1/d

Формальная сложность

NC=P

Джед браун
источник
13

NCO(logcn)O(nk)P=NCPPPPNCPNCP=NC

PP

выбирать
источник
9

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

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

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

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

Примером отсутствия проблемы ветвления является вычисление вектора, который является кумулятивной суммой другого вектора. ([1,2,1] -> [1,3,4])

Я не знаю, считаются ли они «известными», но, безусловно, существует большое количество проблем, с которыми параллельные вычисления вам не помогут.

meawoppl
источник
3
Приведенный вами «пример без ветвления» - это префикс-сумма, который на самом деле имеет хороший параллельный алгоритм: http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html Расчет числа нулей должен быть эффективным по аналогичным причинам. Хотя арифметической интенсивности нет иного пути ...
Макс Хатчинсон
Круто. Я исправлен в этом.
meawoppl
8

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

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

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

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

Томас Климпел
источник
Хороший пример, но я не верю вашей заявленной нижней границе. В частности, многосеточные методы могут быть использованы для решения уравнения эйконала. Как и в случае с многосеточной системой для высокочастотного Гельмгольца, основные проблемы заключаются в проектировании подходящих грубых пространств. В случае лабиринта стратегия агрегации графов должна быть эффективной, причем грубое представление должно определяться путем решения локальных (и, следовательно, независимых) задач для сегментов лабиринта.
Джед Браун
В целом, когда многосеточные методы работают хорошо, это означает, что степень детализации задачи ниже, чем дескритизация, и непропорциональный «объем правильного ответа» исходит из этапа решения задачи. Просто наблюдение, но нижняя граница для такого рода вещей хитрая!
meawoppl
@JedBrown С практической точки зрения многосетка для высокочастотного Гельмгольца является довольно сложной задачей, вопреки тому, что, по-видимому, подразумевает ваш комментарий. И использование multigrid для уравнения эйконала является «редкостью», если не сказать больше. Но я вижу ваше «теоретическое» возражение против предложенной нижней границы: смещения времени из различных точек внутри лабиринта могут быть вычислены до того, как станет известно время достижения этих точек, и добавлены параллельно после того, как недостающая информация станет доступной. Но на практике параллельные эйкональные решатели общего назначения счастливы, если они действительно приближаются к пределу.
Томас Климпел
Я не хотел подразумевать, что это было легко, грубые пространства волнового луча действительно очень технические. Но, я думаю, мы согласны с тем, что уже существует возможность параллелизма в открытых регионах, в то время как в узких «лабиринтах» (которые демонстрируют очень мало параллелизма стандартными методами) проблема масштабирования более поддается решению.
Джед Браун
@JedBrown Slide 39 из www2.ts.ctw.utwente.nl/venner/PRESENTATIONS/MSc_Verburg.pdf (из 2010) говорит о таких вещах, как «Расширить решатель с 2D на 3D» и «Адаптировать метод к задачам с сильно меняющимися волновыми числами». Таким образом, многосетка с волновыми лучами может быть многообещающей, но «еще не созревшая» представляется более подходящей, чем «очень техническая», для описания ее текущих проблем. И это на самом деле не высокочастотный решатель Гельмгольца (потому что это решатель "полной волны"). Существуют и другие «достаточно зрелые» многосеточные решатели Гельмгольца («полноволновые» решатели), но даже они все еще являются «активными исследованиями».
Томас Климпел
1

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

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

Якуб Клинковский
источник