Ответ 1
FWIW, Eigen 3 использует потоки (OpenMP) для матричных продуктов (в ответ на предыдущий оператор Eigen, не использующий потоки).
Мне нужно умножить на матрицы. Я ищу библиотеку, которая может сделать это быстро. Я использую компилятор Visual С++ 2008, и у меня есть ядро i7 860, поэтому, если библиотека оптимизирована для моей конфигурации, она идеальна.
FWIW, Eigen 3 использует потоки (OpenMP) для матричных продуктов (в ответ на предыдущий оператор Eigen, не использующий потоки).
BLAS является фактическим стандартом Fortran для всех основных операций линейной алгебры (по существу, умножения матриц и векторов). Доступны многочисленные реализации. Например:
Затем вы можете использовать оболочку С++, например boost::ublas
.
Если вы программируете на распределенных системах, есть PBLAS и ScaLAPACK, которые позволяют использовать передачу сообщений для распределенных операций линейной алгебры. На многоядерной машине обычно реализация BLAS (по крайней мере, Intel MKL) использует потоки для достаточно больших матриц.
Если вам нужны более продвинутые подпрограммы линейной алгебры (собственные значения, линейные системы, наименьший квадрат,...), то есть другой де-факто стандарт Fortran LAPACK. Насколько мне известно, нет ничего, что могло бы элегантно его интегрировать с С++, кроме вызова простых процедур Fortran. Вам нужно написать некоторые обертки, чтобы скрыть вызовы Fortran и обеспечить реализацию проверки типа звука.
Посмотрите Eigen. Он должен иметь все, что вам нужно.
У меня был хороший опыт работы с Boost uBLAS. Это хороший вариант, если вы уже используете Boost.
Вы можете использовать Научную библиотеку GNU (GSL).
Здесь представлена страница, описывающая операции с матрицами, доступные в библиотеке, включая умножение (gsl_matrix_mul_elements()):
http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html
И вот некоторые ссылки, чтобы вы начали использовать GSL с визуальной студией:
http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php
он не может участвовать в гонке с научными библиотеками, но с визуальным С++ он под рукой
#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;
int main()
{
ULONG_PTR gpToken = 0;
GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL);
//lib inited
Matrix A;
A.Translate(10,20);
Matrix B;
B.Rotate(35.0);
A.Multiply(&B);
if (A.IsInvertible())
A.Invert();
if (!A.IsIdentity())
A.RotateAt(120.0, PointF(10,10));
//getting values
REAL elements[6];
A.GetElements(elements);
//lib stopped
GdiplusShutdown(gpToken);
return 0;
}
поэтому с этим вы можете легко взять препятствие матричного умножения (в Windows)
для более новой версии Visual Studio вы можете использовать ScaLapack + MKL. Образец кода предоставляется здесь, с учебником о том, как его запустить.
http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content
Есть возможность реализовать это самостоятельно, возможно, используя std:: valarray, потому что это может быть распараллелировано с помощью OpenMP: gcc, безусловно, имеет такую версию, вероятно, MSVС++ тоже.
В противном случае следующие трюки: одна из матриц должна быть транспонирована. Тогда у вас есть:
AB [i, j] = Sum (k) A [i, k] B ^ t [j, k]
где вы сканируете непрерывную память. Если у вас есть 8 ядер, вы можете легко разделить набор индексов [i, j] на 8 и дать каждому ядру 1/8 от общей работы. Чтобы сделать это еще быстрее, вы можете использовать команды векторного умножения, большинство компиляторов предоставят для этого специальную функцию. Результат будет не таким быстрым, как настроенная библиотека, но он должен быть в порядке.
Если вы выполняете более длительные вычисления, такие как полиномиальная оценка, оценщик потоков, который также поддерживает потоковую поддержку (gak, два вида потоков), добьется хорошей работы, даже если он не будет выполнять настройку низкого уровня. Если вы действительно хотите быстро сделать что-то, вы должны использовать правильно настроенную библиотеку, такую как Atlas, но тогда вы, вероятно, не будете запускать Windows, если бы серьезно относились к HPC.