ОБНОВЛЕНИЕ (30.07.2014):
Я повторно запустил тест на нашем новом HPC. Как аппаратное обеспечение, так и программный стек изменились по сравнению с настройкой в исходном ответе.
Я помещаю результаты в электронную таблицу Google (содержит также результаты из исходного ответа).
Оборудование
Наш HPC имеет два разных узла: один с процессорами Intel Sandy Bridge, а другой - с новыми процессорами Ivy Bridge:
Сэнди (MKL, OpenBLAS, ATLAS):
- Процессор : 2 x 16 Intel (R) Xeon (R) E2560 Sandy Bridge @ 2,00 ГГц (16 ядер)
- Оперативная память : 64 ГБ
Плющ (MKL, OpenBLAS, ATLAS):
- ЦП : 2 x 20 Intel (R) Xeon (R) E2680 V2 Ivy Bridge @ 2,80 ГГц (20 ядер, HT = 40 ядер)
- Оперативная память : 256 ГБ
Программное обеспечение
Программный стек предназначен для обоих узлов sam. Вместо того , чтобы GotoBLAS2 , OpenBLAS используется , и есть также многопоточный ATLAS BLAS , который установлен в 8 потоков (зашиты).
- ОС : Suse
- Компилятор Intel : ictce-5.3.0
- Numpy: 1.8.0
- OpenBLAS: 0.2.6
- АТЛАС :: 3.8.4
Тест точечного продукта
Код теста такой же, как показано ниже. Однако для новых машин я также провел тест для размеров матрицы 5000 и 8000 .
В таблице ниже представлены результаты тестов из исходного ответа (переименованные: MKL -> Nehalem MKL, Netlib Blas -> Nehalem Netlib BLAS и т. Д.)
Однопоточная производительность:
Многопоточная производительность (8 потоков):
Потоки и размер матрицы (Ivy Bridge MKL) :
Benchmark Suite
Однопоточная производительность:
Многопоточная (8 потоков) производительность:
Вывод
Результаты нового теста аналогичны результатам в исходном ответе. OpenBLAS и MKL работают на одном уровне, за исключением теста на собственное значение . В собственных значениях тест выполняет только достаточно хорошо на OpenBLAS в режиме однотридового . В многопоточном режиме производительность хуже.
Таблица "Размер матрицы и количество нитей" также показывает, что, хотя MKL и OpenBLAS обычно хорошо масштабируются с количеством ядер / потоков, это зависит от размера матрицы. Для небольших матриц добавление большего количества ядер не сильно улучшит производительность.
При переходе от Sandy Bridge к Ivy Bridge производительность увеличивается примерно на 30%, что может быть связано либо с более высокой тактовой частотой (+ 0,8 ГГц), либо с лучшей архитектурой.
Исходный ответ (04.10.2011):
Некоторое время назад мне пришлось оптимизировать некоторые вычисления / алгоритмы линейной алгебры, которые были написаны на Python с использованием numpy и BLAS, поэтому я протестировал / протестировал различные конфигурации numpy / BLAS.
В частности, я тестировал:
- Numpy с ATLAS
- Numpy с GotoBlas2 (1.13)
- Numpy с MKL (11.1 / 073)
- Numpy с Accelerate Framework (Mac OS X)
Я провел два разных теста:
- простое скалярное произведение матриц разного размера
- Набор тестов, который можно найти здесь .
Вот мои результаты:
Машины
Linux (MKL, ATLAS, No-MKL, GotoBlas2):
- ОС : Ubuntu Lucid 10.4 64 бит.
- Процессор : 2 x 4 Intel (R) Xeon (R) E5504 @ 2,00 ГГц (8 ядер)
- Оперативная память : 24 ГБ
- Компилятор Intel : 11.1 / 073
- Scipy : 0,8
- Numpy : 1.5
Mac Book Pro (Accelerate Framework):
- ОС : Mac OS X Snow Leopard (10.6)
- Процессор : 1 Intel Core 2 Duo 2,93 ГГц (2 ядра)
- Оперативная память : 4 ГБ
- Scipy : 0,7
- Numpy : 1.3
Mac Server (Accelerate Framework):
- ОС : Mac OS X Snow Leopard Server (10.6)
- Процессор : 4 процессора Intel (R) Xeon (R) E5520 @ 2,26 ГГц (8 ядер)
- Оперативная память : 4 ГБ
- Scipy : 0,8
- Numpy : 1.5.1
Тест точечного продукта
Код :
import numpy as np
a = np.random.random_sample((size,size))
b = np.random.random_sample((size,size))
%timeit np.dot(a,b)
Результаты :
Система | size = 1000 | size = 2000 | size = 3000 |
netlib BLAS | 1350 мс | 10900 мс | 39200 мс |
ATLAS (1 CPU) | 314 мс | 2560 мс | 8700 мс |
MKL (1 CPU) | 268 мс | 2110 мс | 7120 мс |
MKL (2 процессора) | - | - | 3660 мс |
MKL (8 процессоров) | 39 мс | 319 мс | 1000 мс |
GotoBlas2 (1 CPU) | 266 мс | 2100 мс | 7280 мс |
GotoBlas2 (2 процессора) | 139 мс | 1009 мс | 3690 мс |
GotoBlas2 (8 процессоров) | 54 мс | 389 мс | 1250 мс |
Mac OS X (1 ЦП) | 143 мс | 1060 мс | 3605 мс |
Mac-сервер (1 ЦП) | 92 мс | 714 мс | 2130 мс |
Benchmark Suite
Код :
дополнительную информацию о наборе тестов см. Здесь .
Результаты :
Система | собственные значения | svd | det | inv | точка |
netlib BLAS | 1688 мс | 13102 мс | 438 мс | 2155 мс | 3522 мс |
ATLAS (1 CPU) | 1210 мс | 5897 мс | 170 мс | 560 мс | 893 мс |
MKL (1 CPU) | 691 мс | 4475 мс | 141 мс | 450 мс | 736 мс |
MKL (2 процессора) | 552 мс | 2718 мс | 96 мс | 267 мс | 423 мс |
MKL (8 процессоров) | 525 мс | 1679 мс | 60 мс | 137 мс | 197 мс |
GotoBlas2 (1 CPU) | 2124 мс | 4636 мс | 147 мс | 456 мс | 743 мс |
GotoBlas2 (2 процессора) | 1560 мс | 3278 мс | 116 мс | 295 мс | 460 мс |
GotoBlas2 (8 процессоров) | 741 мс | 2914 мс | 82 мс | 262 мс | 192 мс |
Mac OS X (1 ЦП) | 948 мс | 4339 мс | 151 мс | 318 мс | 566 мс |
Mac-сервер (1 ЦП) | 1033 мс | 3645 мс | 99 мс | 232 мс | 342 мс |
Монтаж
Установка MKL включала установку всего Intel Compiler Suite, что довольно просто. Однако из-за некоторых ошибок / проблем настройка и компиляция numpy с поддержкой MKL была немного хлопотной.
GotoBlas2 - это небольшой пакет, который можно легко скомпилировать как общую библиотеку. Однако из-за ошибки вам необходимо воссоздать общую библиотеку после ее сборки, чтобы использовать ее с numpy.
В дополнение к этому зданию он по какой-то причине не работал для многоцелевой платформы. Поэтому мне пришлось создать файл .so для каждой платформы, для которой я хочу иметь оптимизированный файл libgoto2.so .
Если вы установите numpy из репозитория Ubuntu, он автоматически установит и настроит numpy для использования ATLAS . Установка ATLAS из исходников может занять некоторое время и требует дополнительных действий (fortran и т. Д.).
Если вы установите numpy на компьютер Mac OS X с портами Fink или Mac, он либо настроит numpy для использования ATLAS или Apple Accelerate Framework . Вы можете проверить, запустив ldd в файле numpy.core._dotblas или вызвав numpy.show_config () .
Выводы
MKL работает лучше всего, за ним следует GotoBlas2 .
В тесте на собственные значения GotoBlas2 работает на удивление хуже, чем ожидалось. Не уверен, почему это так.
Apple Accelerate Framework действительно хорошо работает, особенно в однопоточном режиме (по сравнению с другими реализациями BLAS).
И GotoBlas2, и MKL очень хорошо масштабируются с количеством потоков. Так что, если вам приходится иметь дело с большими матрицами, запуск его в нескольких потоках очень поможет.
В любом случае не используйте реализацию netlib blas по умолчанию, потому что она слишком медленная для любой серьезной вычислительной работы.
В нашем кластере я также установил ACML от AMD, и производительность была аналогична MKL и GotoBlas2 . У меня нет жестких цифр.
Я лично рекомендую использовать GotoBlas2, потому что его проще установить и он бесплатный.
Если вы хотите писать код на C ++ / C, также обратите внимание на Eigen3, который в некоторых случаях должен превзойти MKL / GotoBlas2, а также довольно прост в использовании.