Ускорение матричных вычислений с использованием параллельной обработки в C ++? - PullRequest
2 голосов
/ 24 марта 2011

Я пытаюсь вычислить следующее:

Y = Y0 - (Un. (A * Y0) + Vn. (Y0 * Z)) * dt

самым быстрым / наиболее эффективным способом, где Y0, Un, Vn, A и Z - матрицы, размер которых порядка 300 X 300, "." является произведением матрицы, а «*» представляет умножение матрицы.

Мои вопросы:

  1. Вычисляет независимые в вычислительном отношении подматрицы A2 = A * Y0 и Z2 = Y0 * Z, затем Un2 = Un. * A2 и Vn2 = Vn. * Z2 параллельно быстрее, чем вычисляя их последовательно что Y = Y0 - (Un2 + Vn2) * dt? Если да, то каков хороший пример того, как будут выполняться эти параллельные вычисления?

  2. Есть ли какой-нибудь другой лучший / рекомендуемый подход (например, с использованием ATLAS)?

Язык C ++, и он должен работать на платформе Linux или Windows с многоядерными (как минимум, двухъядерными) процессорами. В настоящее время я использую BOOST UBLAS в качестве пакета BLAS.

Ответы [ 3 ]

1 голос
/ 05 августа 2012

Я согласен с @genpfault, в моих экспериментах с несколькими циклами я использую OpenMP, и это очень полезно и проще в использовании!Вот ссылка на блог chryswoods , основы OpenMP, и это одно из самых простых руководств, которые я видел.

1 голос
/ 24 марта 2011

OpenMP должен быть быстрым и простым способом определить, будет ли параллельный маршрут быстрее.

0 голосов
/ 24 марта 2011

Ваша проблема очень мала.Вы должны попробовать использовать что-то вроде Eigen (или как вы упомянули ATLAS).Я предпочитаю Eigen, так как он быстр в использовании.

...