15

http://julialang.org/などでこれまでに確認した Julia のパフォーマンス ベンチマークでは、Julia を純粋な Python または Python+NumPy と比較しています。NumPy とは異なり、SciPy は BLAS および LAPACK ライブラリを使用し、最適なマルチスレッド SIMD 実装を実現します。BLAS 関数と LAPACK 関数を呼び出したときの Julia と Python のパフォーマンスが同じであると仮定すると、BLAS または LAPACK 関数を呼び出さないコードに Numba または NumbaPro を使用した場合、Julia のパフォーマンスは CPython とどのように比較されるでしょうか?

私が気付いたことの 1 つは、Julia が LLVM v3.3 を使用しているのに対し、Numba は LLVM v3.5 上に構築された llvmlite を使用していることです。Julia の古い LLVM は、Intel Haswell (AVX2 命令) などの新しいアーキテクチャでの最適な SIMD 実装を妨げますか?

非常に大きなベクトルを処理するために、スパゲッティ コードと小さな DSP ループの両方のパフォーマンスの比較に関心があります。後者は、GPU デバイス メモリとの間でデータを移動するオーバーヘッドがあるため、GPU よりも CPU によって効率的に処理されます。単一の Intel Core-i7 CPU でのパフォーマンスのみに関心があるため、クラスターのパフォーマンスは重要ではありません。私が特に興味を持っているのは、DSP 関数の並列化された実装を作成する際の容易さと成功です。

この質問の 2 番目の部分は、Numba と NumbaPro の比較です (MKL BLAS は無視します)。Numba のデコレータtarget="parallel"の新しいnogil引数を考えると、 NumbaPro は本当に必要ですか?@jit

4

3 に答える 3

9

これは非常に幅広い質問です。ベンチマーク リクエストに関しては、自分のニーズに合わせていくつかの小さなベンチマークを自分で実行することをお勧めします。質問の 1 つに答えるには:

私が気付いたことの 1 つは、Julia が LLVM v3.3 を使用しているのに対し、Numba は LLVM v3.5 上に構築された llvmlite を使用していることです。Julia の古い LLVM は、Intel Haswell (AVX2 命令) などの新しいアーキテクチャでの最適な SIMD 実装を妨げますか?

[2017/01+:以下の情報は現在の Julia リリースには適用されません]

Haswell には深刻なバグがあったため、Julia は LLVM 3.3 で avx2 をオフにしました。

Julia は、現在のリリースとナイトリー用に LLVM 3.3 でビルドされていますが、3.5、3.6、および通常は svn トランクでビルドできます (特定の日に API の変更をまだ更新していない場合は、問題を報告してください)。これを行うには、LLVM_VER=svn(たとえば) を設定しMake.userてから、ビルド手順に従います。

于 2015-04-09T21:57:42.477 に答える
-2

(比類のないものを比較することは、常に両刃の剣です。

以下は、合理的にサポートされた決定の基礎として得られた結論が役立つ場合、LLVM / JIT を利用したコード ベンチマークを他の LLVM / JIT を利用した代替手段と比較する必要があるという公正な信念に基づいて提示されています。)


イントロ : (numbaスタッフと [us] の結果は、ページの少し下に表示されます )

敬意を表して、公式サイトでは、表形式のパフォーマンス テストのセットを提示しています。ここでは、2 つのカテゴリの事実が述べられています。1つ目は、パフォーマンステストの実行方法に関連しています(ジュリア、LLVMでコンパイルされたコード実行v / s pythonを使用し、GILステップの解釈されたコード実行のままです)。2 つ目は、C でコンパイルされたコードの実行を相対的な時間の単位として使用して、他の言語が同じ「ベンチマーク タスク」を完了するのにどれくらいの時間がかかるか = 1.0

結果を含む表の上にある章のヘッダーには、次のように書かれています (cit.:)

高性能 JIT コンパイラ
Julia の LLVM ベースの Just-In-Time (JIT) コンパイラと言語の設計を組み合わせることで、C のパフォーマンスに近づき、多くの場合、C のパフォーマンスに匹敵することができます 。と呼ばれる「ベンチマーク タスク」-s の.

ここに画像の説明を入力
pi-sum

これは解釈された Python にとって 2 番目に悪い時間であり、LLVM/JIT でコンパイルされた Julia コードまたは C でコンパイルされた代替よりも21.99 倍遅く実行されたことが示されました。

そこで、小さな実験の話が始まりました。

@numba.jit( JulSUM, nogil = True ):

リンゴとリンゴを比較してみましょう。julia コードが 22 倍高速に実行されると報告されている場合は、まず、単純に解釈された Python コードの実行を測定してみましょう。

>>> def JulSUM():
...     sum = 0.
...     j   = 0
...     while j < 500:
...           j   += 1
...           sum  = 0.
...           k    = 0
...           while k < 10000:
...                 k   += 1
...                 sum += 1. / ( k * k )
...     return sum
...
>>> from zmq import Stopwatch
>>> aClk = Stopwatch()
>>> aClk.start();_=JulSUM();aClk.stop()
1271963L
1270088L
1279277L
1277371L
1279390L
1274231L

つまり、コアのpi-sum実行時間は約 1.27x.xxx [us] ~ 約 1.27~1.28 [s] です。

Webサイトの言語プレゼンテーションの表の行pi-sum考えると、LLVM/JIT を利用した julia コードの実行は約 22 倍速く、つまり57.92 [ms]未満で実行されるはずです。

>>> 1274231 / 22
57919

numba.jitでは、 ( v24.0 )を使用してオレンジをリンゴに変換しましょう。

>>> import numba
>>> JIT_JulSUM = numba.jit( JulSUM )
>>> aClk.start();_=JIT_JulSUM();aClk.stop()
1175206L
>>> aClk.start();_=JIT_JulSUM();aClk.stop()
35512L
37193L
37312L
35756L
34710L

したがって、JIT コンパイラーが機能した後、numba-LLVM を実行した python は、ベンチマーク時間を約 34.7 ~ 37.3 [ms]のどこかで示します。

もっと先に行ける?

確かに、numbaまだ多くの微調整を行っていませんが、コード例は非常に些細なものであり、将来的に驚くような進歩が見られることはあまりありません。

まず、ここで不要な GIL ステッピングを削除しましょう。

>>> JIT_NOGIL_JulSUM = numba.jit( JulSUM, nogil = True )
>>> aClk.start();_=JIT_NOGIL_JulSUM();aClk.stop()
85795L
>>> aClk.start();_=JIT_NOGIL_JulSUM();aClk.stop()
35526L
35509L
34720L
35906L
35506L

nogil=True
実行はそれほど長くはありません
が、それでも数 [ミリ秒] 短縮され、すべての結果が ~ 35.9 [ミリ秒] 未満になります。

>>> JIT_NOGIL_NOPYTHON_JulSUM = numba.jit( JulSUM, nogil = True, nopython = True )
>>> aClk.start();_=JIT_NOGIL_NOPYTHON_JulSUM();aClk.stop()
84429L
>>> aClk.start();_=JIT_NOGIL_NOPYTHON_JulSUM();aClk.stop()
35779L
35753L
35515L
35758L
35585L
35859L

nopython=True
すべての結果を一貫して ~ 35.86 [ms] 未満で
取得するための最後の仕上げのタッチのみを行います(対 LLVM/JIT-julia の ~ 57.92 [ms] )。


DSP 処理のエピローグ:

高速化された DSP 処理の追加の利点に関する OP の質問のために、Intel が IA64 プロセッサの内部性に最適化されたバイナリで新しい地平を開いた+ Intel Python
(Anaconda 経由) を試してテストすることができます。インテルの ILP4 の知識、ベクトル化、および実行時に独自の CPU が示す分岐予測の詳細に基づいて、CPU にバインドされた追加のトリックが実行される場合があります。これを比較するには、テストする価値があります (さらに、VisualStudio に統合された非破壊的なコード分析ツールを利用して、in-vitro コード実行のホットスポットをリアルタイムで分析することができます。これは、DSP エンジニアが大好きなものです。 、彼/彼女ではないですか?numba

于 2017-01-01T20:14:23.707 に答える