oneMKL を使用して大量の数学計算を実行する Python* アプリケーションを高速化します。
大量の数学計算を実行する Python* アプリケーションで以下のパッケージを使用します。
NumPy* |
N 次元配列オブジェクト、汎用データの多次元コンテナーからなります。 |
SciPy* |
線形代数、統計、積分、フーリエ変換、常微分方程式ソルバー、その他のモジュールを含みます。高速 N 次元配列操作については NumPy* に依存します。 |
NumPy*/SciPy* 計算を高速化するには、oneMKL を使用してこれらのパッケージのソースをビルドし、パフォーマンスを測定するサンプルを実行します。インテル® Xeon Phi™ コプロセッサーが利用可能なシステムでさらにパフォーマンスを向上するには、自動オフロードを有効にします。
oneMKL で事前ビルドされた NumPy* と SciPy* を活用するには、https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html からインテル® ディストリビューションの Python* をダウンロードしてください。
これらのステップは、Linux* または Windows* オペレーティング・システム、インテル® 64 アーキテクチャー、ILP64 インターフェイスを想定しています。
http://www.scipy.org/Download (英語) から最新の NumPy* および SciPy* パッケージを取得して展開します。
最新バージョンの oneMKL、インテル® C++ コンパイラー、インテル® Fortran コンパイラーをインストールします。
インテル® C++ コンパイラーおよびインテル® Fortran コンパイラーの環境変数を設定します。
Linux*:
次のコマンドを実行します。
$source <intel tools installation dir>/bin/compilervars.sh intel64
Windows*:
環境設定を起動して Intel64 ビルドバイナリーの Visual Studio* モードを指定します。
(Windows* 8:)マウスポインターを画面の左下隅に移動し、マウスの右ボタンをクリックして、[検索] を選択し、画面の白い部分をクリックします。
[Intel Parallel Studio 2016 (インテル® Parallel Studio 2016)] セクションに移動して、[Intel64 Visual Studio 20XX mode (インテル® 64 VS 20XX モード)] を選択します。
ディレクトリーを <NumPy dir> に変更します。
既存の site.cfg.example をコピーし、site.cfg として保存します。
site.cfg を開き、[mkl] セクションのコメントを解除して、次のように変更します:
Linux* :
[mkl] library_dirs = /opt/intel/compilers_and_libraries_2016/linux/mkl/ lib include_dirs = /opt/intel/compilers_and_libraries_2016/linux/mkl/ include mkl_libs = mkl_rt lapack_libs =
Windows*:
[mkl] library_dirs = C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016\windows\mkl\lib\intel64;
C:\Program Files (x86)\Intel\Composer XE 2015.x.yyy\compiler\lib\intel64 include_dirs = C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016\windows\mkl\include mkl_libs = mkl_lapack95_lp64,mkl_blas95_lp64,mkl_intel_lp64,mkl_intel_thread,mkl_core,libiomp5md lapack_libs = mkl_lapack95_lp64,mkl_blas95_lp64,mkl_intel_lp64,mkl_intel_thread,mkl_core,libiomp5md
インテル® C++ コンパイラーの最適化オプションを渡すように、<NumPy dir>/distutils の intelccompiler.py を変更します。
Linux*:
self.cc_exe = 'icx –O3 –g -xhost –fPIC –fomit-frame-pointer –openmp –DMKL_ILP64'
Windows*:
self.compile_options = [ '/nologo', '/O3', '/MD', '/W3', '/Qstd=c99',
'/QxHost', '/fp:strict', '/Qopenmp']
インテル® Fortran コンパイラーの最適化オプションを渡すように、<NumPy dir>/distutils/fcompiler フォルダーの intel.py を変更します。
Linux*:
ifort –xhost –openmp –i8 –fPIC
Windows*:
def get_flags(self): opt = ['/nologo', '/MD', '/nbs','/names:lowercase', '/assume:underscore']
ディレクトリーを <NumPy dir> に変更し、NumPy* をビルドしてインストールします。
Linux* :
$python setup.py config --compiler=intelem build_clib --compiler=intelem build_ext --compiler=intelem install
Windows*:
python setup.py config --compiler=intelemw build_clib --compiler=intelemw build_ext --compiler=intelemw install
ディレクトリーを <SciPy dir> に変更し、SciPy* をビルドしてインストールします。
Linux* :
$python setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install
Windows*:
python setup.py config --compiler=intelemw --fcompiler=intelvem build_clib --compiler=intelemw --fcompiler=intelvem build_ext --compiler=intelemw --fcompiler=intelvem install
import numpy as np import scipy.linalg.blas as slb import time M = 10000 N = 6000 k_list = [64, 128, 256, 512, 1024, 2048, 4096, 8192] np.show_config() for K in k_list: a = np.array(np.random.random((M, N)), dtype=np.double, order='C', copy=False) b = np.array(np.random.random((N, K)), dtype=np.double, order='C', copy=False) A = np.matrix(a, dtype=np.double, copy=False) B = np.matrix(b, dtype=np.double, copy=False) start = time.time() C = slb.dgemm(1.0, a=A, b=B) end = time.time() tm = start - end print ('{0:4}, {1:9.7}'.format(K, tm))
ソースコード: サンプル (https://www.intel.com/content/dam/develop/external/us/en/documents/mkl-cookbook-samples-120115.zip (英語)) の dgemm_python フォルダーを参照してください。
インテル® Xeon Phi™ コプロセッサーがシステムで利用可能な場合、コプロセッサーへの計算の自動オフロードを有効にするには、MKL_MIC_ENABLE 環境変数を 1 に設定します。
ビルドステップはデフォルトの Python* パスに NumPy* および SciPy* をインストールします。NumPy* および SciPy* をホームまたは別のフォルダーにインストールするには、ステップ 9 および 10 のコマンドで –prefix=$HOME またはフォルダーのパスを指定します。Python* を $HOME にインストールした場合、NumPy* をビルドした後、SciPy* をビルドする前に、PYTHONPATH 環境変数を $HOME/lib/pythonY.Z/site-packages に設定します。ここで、Y.Z は Python* のバージョンです。
Intel64 ビルドバイナリーの Visual Studio* モードを選択するステップ 3 の命令は、Windows* のバージョンに依存します。次に例を示します。
Windows* 7 では、[すべてのプログラム] > [Intel Parallel Studio XE 20XX (インテル® Parallel Studio XE 20XX)] > [Compiler and Performance Libraries (コンパイラーおよびライブラリー)] > [Intel Compiler <version> Command Prompt (インテル(R) コンパイラー <バージョン> コマンドプロンプト)] に移動して、[Intel64 Visual Studio 20XX mode (インテル® 64 VS 20XX モード)] を選択します。ここで、20XX は Visual Studio* のバージョン (2015 など) です。
コードサンプルは最も一般的な行列乗算ルーチン dgemm を SciPy* および NumPy* の配列から使用して、入力行列を作成、初期化します。oneMKL を使用して NumPy* および SciPy* をビルドした場合、このコードは oneMKL BLAS dgemm ルーチンを呼び出します。
インテル® Xeon Phi™ コプロセッサーがシステムで利用可能な場合、一部の oneMKL ルーチンはコプロセッサーを活用することができます (自動オフロードが有効な oneMKL 関数のリストは、[AO] を参照してください)。自動オフロードが有効な場合、これらのルーチンはホスト CPU とコプロセッサー間で計算を分割します。