numpy на многоядерном оборудовании

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

Я рад перестроить numpy, если это необходимо, но на данный момент я ищу способы ускорить процесс без изменения моего кода.

Для справки, мой show_config() выглядит следующим образом, и я никогда не наблюдал, чтобы numpy использовал более одного ядра:

atlas_threads_info:
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    language = f77
    include_dirs = ['/usr/local/atlas-3.9.16/include']

blas_opt_info:
    libraries = ['ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')]
    language = c
    include_dirs = ['/usr/local/atlas-3.9.16/include']

atlas_blas_threads_info:
    libraries = ['ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    language = c
    include_dirs = ['/usr/local/atlas-3.9.16/include']

lapack_opt_info:
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')]
    language = f77
    include_dirs = ['/usr/local/atlas-3.9.16/include']

lapack_mkl_info:
  NOT AVAILABLE

blas_mkl_info:
  NOT AVAILABLE

mkl_info:
  NOT AVAILABLE

person NPE    schedule 13.05.2011    source источник
comment
Я сомневаюсь, что вы сможете добиться какого-либо ускорения за счет многопоточных вычислений скалярных произведений векторов размера 4000. Для вычисления такого скалярного произведения требуется всего несколько микросекунд. Накладные расходы на назначение задачи отдельному потоку, вероятно, по крайней мере сведут на нет любую скорость, которую вы можете получить, даже при использовании пулов потоков.   -  person Sven Marnach    schedule 14.05.2011
comment
Я умножаю матрицы 32M x (4k... 1,5M) на матрицы (4k...1,5M) x что-то и пытался сделать это с помощью набора инструментов многопроцессорной обработки, тем не менее это, похоже, создает много накладных расходов памяти, поскольку данные копируются в новые процессы (спасибо за это GIL). Было бы здорово, если бы Atlas использовал все 8 ядер.   -  person Herbert    schedule 30.06.2015


Ответы (1)


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

main()
/*
 * Compile, link and run with something like:
 *    gcc -o xprint_buildinfo -L[ATLAS lib dir] -latlas ; ./xprint_buildinfo
 * if link fails, you are using ATLAS version older than 3.3.6.
 */
{
   void ATL_buildinfo(void);
   ATL_buildinfo();
   exit(0);
}

Если у вас нет многопоточной версии Atlas: "вот ваша проблема". Если это многопоточность, вам нужно выполнить одну из многопоточных подпрограмм BLAS3 (вероятно, dgemm) с достаточно большим матрично-матричным произведением и посмотреть, используется ли многопоточность. Я думаю, что прав, говоря, что ни подпрограммы BLAS 2, ни BLAS 1 в Atlas не поддерживают многопоточность (и не без оснований, потому что нет никакого преимущества в производительности, кроме как при действительно огромных размерах задач).

person talonmies    schedule 13.05.2011
comment
Что такое команда компилятора? каким должен быть -L[ATLAS lib dir]? - person Nino; 09.08.2012