Вопрос по scipy, python, numpy, intel-mkl, multithreading – Предполагается, что функции scipy и numpy с автоматической резьбой не используют несколько ядер

7

Я использую Mac OS X 10.6.8 и использую Enthought Python Distribution. Я хочу, чтобы функции numpy использовали оба моих ядра. У меня возникла проблема, похожая на эту в этом посте:многопоточный блас в Python / Numpy но после выполнения шагов этого плаката у меня все еще остается та же проблема. Вот мой numpy.show_config ():

lapack_opt_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread']
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include']
blas_opt_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread']
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include']
lapack_mkl_info:
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread']
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include']
blas_mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread']
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include']
mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread']
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include']

Как и в комментариях к исходному сообщению, я удалил строку, в которой установлена переменнаяMKL_NUM_THREADS=1, Но даже тогда функции numpy и scipy, которые должны использовать преимущества многопоточности, используют только одно из моих ядер одновременно. Есть что-то еще, что я должен изменить?

Изменить: Чтобы уточнить, я пытаюсь получить один единственный расчет, такой как numpy.dot (), чтобы использовать многопоточность самостоятельно в соответствии с реализацией MKL, я не пытаюсь воспользоваться тем фактом, что Numpy вычисления освобождают контроль GIL, следовательно, облегчает многопоточность с другими функциями.

Вот небольшой скрипт, который должен использовать многопоточность, но не на моем компьютере:

import numpy as np

a = np.random.randn(1000, 10000)
b = np.random.randn(10000, 1000)

np.dot(a, b) #this line should be multi-threaded
Я только что попробовал:python -mtimeit -s'import numpy as np; a = np.random.randn(1e3,1e3)' 'np.dot(a, a)' Он использует несколько ядер. Так что, по крайней мере, в некоторых конфигурациях это можно сделать. jfs
@Nino:timeit исполняетnp.dot() последовательно. Это синхронная операция, следующая не начинается, пока не закончится предыдущая. Весь параллелизм внутриnp.dot(). jfs
Размещение вашего кода может помочь Daniel Velkov
@ J.F.Sebastian Я только что попытался сделать именно то, что ты сделал, и полностью использовал мои ядра. Причина в том, что вычисления с пустым фрагментом освобождают GIL, поэтому при выполнении нескольких различных вычислений в форме цикла for (как это делается timeit) каждый расчет выполняется в отдельном потоке. Однако у меня возникают проблемы с многопоточностью одного вычисления. Если я просто запускаю скрипт, похожий на ваш, без использования timeit (следовательно, без итераций), одновременно используется только одно ядро. Nino
@ J.F.Sebastian Я знаю, что это возможно, но я пытаюсь выяснить, что мне не хватает. Nino

Ваш Ответ

1   ответ
7

Эта статья похоже, подразумевает, что numpy разумно делает некоторые операции параллельными, в зависимости от прогнозируемого ускорения операции:

"If your numpy/scipy is compiled using one of these, then dot() will be computed in parallel (if this is faster) without you doing anything. "

Возможно, ваш небольшой (-иш) тестовый пример не будет показывать значительного ускорения в соответствии с эвристикой numpy для определения, когда следует распараллеливать конкретный вызов dot ()? Может быть, попробовать смехотворно большую операцию и посмотреть, используются ли оба ядра?

Как примечание, действительно ли конфигурация вашего процессора / машины поддерживает BLAS?

Ну и дела, спасибо!
Это действительно поддерживает BLAS, но об этом не может быть и речи, потому что мой numpy связан с MKL. Итак, как ни странно, просто из-за разочарования я попытался запустить этот скрипт выше, и теперь он работает. Очень сбивает с толку ... Но теперь мне пора, и с тех пор, как вы ответили, 50 баллов вам. Благодарю. Nino

Похожие вопросы