7

Mac OS X 10.6.8を実行していて、EnthoughtPythonDistributionを使用しています。numpy関数が両方のコアを利用できるようにしたいと思います。私はこの投稿と同様の問題を抱えています:python / numpyのマルチスレッドblasですが、そのポスターの手順を実行した後でも、同じ問題があります。これが私の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関数は、一度に1つのコアしか使用していません。他に変更すべきものはありますか?

編集:明確にするために、私は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
4

1 に答える 1

7

この記事は、操作の予測される高速化に応じて、numpyが特定の操作をインテリジェントに並列化することを示唆しているようです。

  • 「numpy/scipyがこれらのいずれかを使用してコンパイルされている場合、dot()は何もしなくても並列に計算されます(これが速い場合)。」

おそらく、あなたの小さな(-ish)テストケースは、特定のdot()呼び出しをいつ並列化するかを決定するためのnumpyのヒューリスティックに従って、大幅なスピードアップを示さないでしょうか?ばかばかしいほど大規模な操作を試して、両方のコアが使用されているかどうかを確認してください。

ちなみに、プロセッサ/マシン構成は実際にBLASをサポートしていますか?

于 2012-08-07T20:02:34.107 に答える