問題タブ [parallelism-amdahl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 重要な再コーディング: プログラムを高速化するには? Cython、numba、マルチプロセッシング、numpy?
私は次のことを行うプログラム (いくつかのペア取引戦略) を持っています (または実際に取り組んでいます):
- postgres データベースにある大規模なデータ セット (財務データ: 100 株までの日時インデックスと株価) のサブセットを取得します。
- データを消去し (NaN が 30% を超える銘柄をドロップ)、リターンとインデックスを計算します (各銘柄の最初の観察に関連する)。
- 株式ペアのすべての組み合わせを見つけて、相関関係を計算します (実際にはそれに似た尺度ですが、ここでも重要です)
- 相関が最も高いペアを最低にランク付けするか、相関 > 定義されたしきい値、つまり 0.9 を持つペアのみを選択します。
- 両方の方法で共和分についてこれらのペアのそれぞれをチェックしてください! テスト値に従ってランク付けします
- 上位 n 個、つまり 10 個のペアを選択して取引し、移動平均と標準偏差に基づいてシグナルを計算します。
- 「サンプル外」ウィンドウを取得し、株を取引する
- 日誌に毎日の帰省(つまり 5 日間)を記録する
- いくつかの統計を計算する
これらの 9 つの手順の後、最初からやり直して、別のトレーニング ウィンドウを取得し、分析を実行します...
私のアプローチは次のようになります - より良いものを見つけたら修正してください:
1. プログラムからできるだけ多くの関数を抽出する
2. ステップ 1-9 を複数のトレーニング ウィンドウとトレーディング ウィンドウでループする
そして私の結果の質問(ここフォーラムの多くのスレッドに触発され、つまり、Pythonコードをより高速に実行する方法
- コードのどの部分を並行して実行できるかを特定するにはどうすればよいですか?
- どういうわけか、それは私にはまったく些細なことのように思えます。マルチプロセッシングを使用できるように、コードを「書き直す」ために適用する手法は何ですか?
- また、常に明らかであるとは限りません: ループを関数として書き換えます。常に注目すべき特定の角度はありますか?
numba.jit()
" " すべての関数に意味がありますか?- データのすべての形式を に変更する必要があります
float64
か? どのような不利益が発生する可能性がありますか?(現時点では、それらは「標準」の数値です) - ループをいつベクトル化できるかを確認できるチェックリストはありますか?
多くの - かなり概念的な - 質問をお詫び申し上げますが、上記の「痛み」のポイントをすべて理解できれば、「論理的」理解が本当に向上し、新しい Python ジョイナーにとっても非常に有益になると思います。
parallel-processing - OpenMP - ランダムな実行時間 - 実行時間の変動が非常に大きいのはなぜですか?
いくつかの並列プログラミングの概念を実装する方法を学ぶために、OpenMP に関するTim Mattsonの講義に従っています。
3x10^8ステップを使用してPIの値を計算する並列プログラムの実行時の動作を観察しようとしていました。
ここにコードがあります、
現在、デュアルコアマシンで実行されているUbuntu 14.04 LTSを使用していました。omp_get_num_procs()
返された2への呼び出し。実行時間は、1.31 秒から 4.46 秒までの範囲で、完全にランダムのようなものでした。シリアルプログラムは、ほとんど常に 2.31 秒かかっていました。
1、2、3、4、最大10スレッドを作成してみました。実行時間はすべてのケースで大きく異なりますが、スレッド数が多いほど平均は短くなります。私は他のアプリケーションを実行していませんでした。
実行時間があまりにも大きく変動した理由を誰か説明できますか?
実行時間を正確に計算する方法は? 講師は、一貫しているように見える彼のコンピューターの実行時間を与えました。また、彼はデュアル コア プロセッサも使用していました。
python - python joblib & random walk - a performance of [CONCURRENT]-process scheduling
Here is my python-3.6 code for simulating a 1D reflected random walk, using the joblib
module to generate 400 realizations concurrently across K
workers on a Linux cluster machine.
I note, however, that the runtime for K=3
is worse than for K=1
, and that the runtime for K=5
is even worse!
Can anyone please see a way to improve my use of joblib
?
python - Python での配列代入の並列化
メインで呼び出されたときに関数全体を並列化しようとしましたが、以下に表示される関数のセグメントは運が悪く、TypeError: function object is not iterable
.. 提案をいただければ幸いです。
python - マルチプロセッシングの実行速度が非常に速いのに、Dask の実行速度が非常に遅いのはなぜですか?
並列について理解を深めるために、さまざまなコードのセットを比較しています。
これが基本的なもの (code_piece_1) です。
for ループ
このコードは、タイム コンシューマーをシリアル スタイル (for ループ) で実行し、この結果を得ました。
マルチプロセッシング
マルチプロセッシング スタイルは、並列コンピューティングを実装する方法と見なすことができますか?
ドキュメントがそう言っているので、私はイエスだと思います。
ここに code_piece_2 があります
このコードは、マルチプロセッシング スタイルで同時にコンシューマーを実行し、この結果を得ました
明らかに、この特定のケースでは、マルチプロセッシングの方がシリアルよりも高速です。
ダスク
Daskは、Python で並列計算を行うための柔軟なライブラリです。
このコード (code_piece_3) は、コンシューマと Dask を同時に実行しました (Dask を正しい方法で使用しているかどうかはわかりません)。
私は得た
私のCPUには6つの物理コアがあります
質問
マルチプロセッシングの実行速度が非常に速いのに、Dask の実行速度が非常に遅いのはなぜですか?
Dask を間違った方法で使用していますか? はいの場合、正しい方法は何ですか?
注:この特定のケースまたは他の特定の具体的なケースと相談してください。一般的に話さないでください。
c - OpenMP ベンチマーク並列計算
f(x)
繰り返しごとにスレッド数を変えながら、コンピューティングのベンチマークを試みています。
f(x) = c * ln(x) * cos(x)
n=10000000
結果:
さまざまなスレッドを開始しました:
並列: n=10000000、p=2、所要時間=0.153774、スピードアップ=3.503831
並列: n=10000000、p=3、所要時間=0.064447、スピードアップ=8.360370
並列: n=10000000、p=4、所要時間=0.044694、スピードアップ=12.055239
並列: n=10000000、p=5、所要時間=0.048700、スピードアップ=11.063550
並列: n=10000000、p=6、所要時間=0.039009、スピードアップ=13.811989
並列: n=10000000、p=7、所要時間=0.041735、高速化=12.910017 の場合
並列: n=10000000、p=8、所要時間=0.041268、スピードアップ=13.055919
並列: n=10000000、p=9、所要時間=0.039032、スピードアップ=13.804157
並列: n=10000000、p=10、所要時間=0.038970、スピードアップ=13.825767
並列: n=10000000、p=11、所要時間=0.039843、スピードアップ=13.522884
並列: n=10000000、p=12、所要時間=0.041356、スピードアップ=13.028237
並列: n=10000000、p=13、所要時間=0.041039、スピードアップ=13.128763
並列: n=10000000、p=14、所要時間=0.047433、スピードアップ=11.359218
並列: n=10000000、p=15、所要時間=0.048430、スピードアップ=11.125202
並列: n=10000000、p=16、所要時間=0.051950、スピードアップ=10.371477
注:ここでの高速化は、シーケンシャル アルゴリズム (スレッド = 1) に対して計算されます。
p
(スレッド数)の変動による高速化の影響はあまりないようです。
私はこれを正しく行っていますか、それともスレッド数の非効率的な増分が原因です (つまり、理論的に言えば、変更してp
も深刻な影響はありませんO(myprogram)
)。
python - Chapel と Python の統合に関する質問
Python ベースの気候モデルで使用する並列コードを記述するために Chapel を使用できるかどうかを確認しようとしています: https://github.com/CliMT/climt
Chapel の使用経験はありませんが、私のユースケースには非常に有望なようです。Chapel コードを現在のワークフローに統合する方法について、いくつか質問がありました。
インポート可能なファイルをビルドできることは知っていますが
.so
、Cython ファイルが生成されたときにコンパイルが停止することはありますか? 次に、それをディストリビューションに含め、標準を使用setuptools
して Travis でプロジェクトをコンパイルします。numpy
Chapel で記述された Python 拡張機能に配列を渡すことはできますか?2. の答えが「はい」で、私の計算が配列の 1 次元で恥ずかしいほど並列である場合、Chapel でこの並列処理を表現する洗練された方法はありますか?
複数のノードで動作する Chapel コードを作成し、それを Python 拡張機能にコンパイルする場合、どのように実行すればよいですか?
mpirun python my_code.py
コマンドのようなものを使用できますか?