scipy.weave
Pythonスクリプトのパフォーマンスに重要な部分に使用します。可能であれば、OpenMP を使用してこれらのコードを並列化します。場合によってはボトルネックが発生しますが、これはおそらく偽の共有が原因です。これらのインライン コードをプロファイリングするにはどうすればよいですか。つまり、Linux プラットフォームでの適切なツールに関する提案はありますか?
以下のベクトル加算の不適切な実装を参照してください。
from scipy.weave import inline
import numpy as np
import time
N = 1000
a = np.random.rand(N)
b = np.random.rand(N)
c = np.random.rand(N)
cpus = 4
weave_options = {'headers' : ['<omp.h>'],
'extra_compile_args': ['-fopenmp -O3'],
'extra_link_args' : ['-lgomp'],
'compiler' : 'gcc'}
code = \
r"""
omp_set_num_threads(cpus);
#pragma omp parallel
{
#pragma omp for schedule(dynamic)
for ( int i=0; i<N; i++ ){
c[i] = a[i]+b[i];
}
}
"""
now = time.time()
inline(code,['a','b','c','N','cpus'],**weave_options)
print "TOOK {0:.4f}".format(time.time()-now)
print "SUCCESS" if np.all(np.equal(a,a)) else "FAIL"
編集:
使用可能です
valgrind --tool=callgrind --simulate-cache=yes python ***.py
kcachegrind ./callgrind.out.****
少しでも印象に残るように。しかし、この種のラッピング コードでは、結果が乱雑になる傾向があります。