Как стать автором
Обновить

Комментарии 14

Есть альтернативный способ добавить многопоточность к numpy: библиотека numexpr
Там же вроде нет линейной алгебры?
Теоретически, можно, конечно, найти исходники библиотек, перекомпилировать их и пересобрать numpy. Я даже слышал, что кто-то писал, что он видел людей, которые говорили, что им это удалось… В общем, самый простой способ — это установить научный дистрибутив Python, например, Anaconda или Canopy.


Если не хочется ставить анаконду ради одной библиотеки, можно просто скачать Wheel-пакет для 32- или 64-битной версии Windows, собранный с MKL. Устанавливается одной командой. Например,
pip install numpy-1.10.2+mkl-cp35-none-win_amd64.whl

установит Numpy 1.10.2, собранный с MKL, для 64-битного python 3.5.

На сайте полно скомпилированных пакетов для научных вычислений, пожалуйста, не положите его ненароком. ;)
Спасибо за отличное дополнение.
Раньше бесплатный MKL тоже был однопоточным. Но Intel в итоге сделала community лицензию для своих библиотек без ограничений по потокам — software.intel.com/sites/campaigns/nest
Забыл добавить. Посмотреть информацию о используемых библиотеках можно проще:
import numpy as np
np.show_config()

Если установить dev-пакеты для OpenBLAS, то numpy при сборке сам подхватит библиотеку. Например, в Ubuntu нужно установить libopenblas-dev и libopenblas-base. Если достаточно версии из репозитория, то ничего самому компилировать не нужно. Достаточно установить пакеты и переустановить numpy через pip.

Использовать pip с sudo тоже не стоит, по-моему. Лучше, когда есть только один общесистемный менеджер пакетов. Я свежие математические библиотеки устанавливаю в виртуальное окружение. Довольно удобно, легко обновлять и доустанавливать что-то, а главное — не нужны права root.
А совет для тех, у кого не deb-based?
Если кратко, суть статьи — перекомпилировать Numpy. Это отлично делает pip, но надо в своём дистрибутиве сперва установить OpenBLAS или MKL.
Имею следующий выхлоп:

$ dnf list installed | grep openblas
openblas.x86_64                        0.2.15-2.fc23                    @updates
openblas-devel.x86_64                  0.2.15-2.fc23                    @updates
openblas-openmp.x86_64                 0.2.15-2.fc23                    @updates
openblas-openmp64.x86_64               0.2.15-2.fc23                    @updates
openblas-openmp64_.x86_64              0.2.15-2.fc23                    @updates
openblas-serial64.x86_64               0.2.15-2.fc23                    @updates
openblas-serial64_.x86_64              0.2.15-2.fc23                    @updates
openblas-threads.x86_64                0.2.15-2.fc23                    @updates
openblas-threads64.x86_64              0.2.15-2.fc23                    @updates
openblas-threads64_.x86_64             0.2.15-2.fc23                    @updates

$ ldd multiarray.so
	linux-vdso.so.1 (0x00007ffc94ee8000)
	libopenblas.so.0 => /lib64/libopenblas.so.0 (0x00007f9316707000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f9316405000)
	libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f931603b000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9315e1e000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f9315a5d000)
	/lib64/ld-linux-x86-64.so.2 (0x0000555786b82000)
	libgfortran.so.3 => /lib64/libgfortran.so.3 (0x00007f9315730000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f931552c000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007f9315329000)
	libquadmath.so.0 => /lib64/libquadmath.so.0 (0x00007f93150e9000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f9314ed2000)

Что-то не могу разобраться в значениях top, на которое из двух смотреть?
%Cpu(s): 79.1 us, 10.4 sy,  0.0 ni,  9.3 id,  1.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010052 total,   141700 free,  4756624 used,  3111728 buff/cache
KiB Swap:  2095100 total,  2060716 free,    34384 used.  2810328 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                             
10185 USER      20   0 2642864 2.276g  11056 R 100.0 29.8   3:54.40 python 

Не пинайте сильно
я только начал разбираться в проге основательно
После запуска top нажмите «1», тогда вместо строки "%Cpu(s)" отобразятся данные отдельно по каждому процессору.
Ага, спасибо. Одно ядро загружено полностью, второе — процентов на 20. Так и должно быть?
Если вы запускаете пример из статьи, то он должен грузить на 100% все имеющиеся ядра, а у вас загружено только одно.
Странно, именно его запускаю. Что может быть не так?
Причин может быть много.
У вас Linux установлен прямо на «железо» или на виртуальную машину?

Попробуйте запустить тест вот так:
$ OMP_NUM_THREADS=4 python test.py
На железе стоит. Попробовал, результат не изменился.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации