共有メモリ並列プログラミング向けのPythonガイド


11

共有メモリマシン用のOpenMPをコーディングして(CとFORTRANの両方で)行列加算、乗算などの単純なタスクを実行した経験があります(LAPACKと競合する方法を確認するだけです)。OpenMPは、ドキュメントを見なくても簡単なタスクを実行できるほど十分に知っています。

最近、私は自分のプロジェクトでPythonに移行しましたが、絶対的な基本を超えるPythonの経験はありません。

2つの質問があります。

  • Pythonの共有メモリパラレルコンピューティングについて説明するための優れたガイド(オンラインPDF)はありますか?

  • それを達成する最良の方法は何ですか?私は少し見ましたがctypes、それが最良の方法であるかどうかはわかりません。(最良の意味で言うと、プログラマー時間とシステム時間の間に良いトレードオフがあるものを意味します。コーディングが面倒にならないようにし、実行が遅くならないようにしてください)

回答:


8

[これが私の最初の投稿であり、SEの使用を完全に誤解していないことを望みます-もしそうであれば、事前に謝罪します]

「bgschaid」には、提供された情報に基づいて質問に答えるのが非常に難しいことに同意します。低レベルのルーチンでマルチコアアーキテクチャを活用したい場合、または並外れた並列問題のために並列処理を活用する必要がある場合、またはその中間の場合、大きな違いが生じます。Pythonでのさまざまな並列計算の可能性の概要については、こちらをご覧ください

前者の場合、少なくともEnthoughtのMKLコンパイルバージョンでマルチコアアーキテクチャをサポートするNumPy / SciPyなどのツールを使用することをお勧めします。ここでは、環境変数「MKL_NUM_THREADS」を使用して、使用するコアの数を制御できます。これは高度に最適化されたライブラリに依存しているため、パフォーマンスの面で勝つことはほとんどありません。これらの高品質で高度に最適化されたライブラリを可能な限り使用することをお勧めします。

大まかなレベルで並列処理を利用する場合、Python標準ツールのマルチプロセッシングは使いやすく、共有データオブジェクトもサポートしています。マルチプロセッシングパッケージの一部として使用するさまざまなツールがあります。私が使用しているmap_async(SIMDなど)apply_async良い結果にはいくつかの問題のために(MIMDなど)。マルチプロセッシングパッケージには、非常に使いやすいですし、あなたのコードの他の潜在的なユーザーが簡単にそれを使用できることを期待できるというPythonの手段の標準部分です。 マルチプロセッシングは、NumPyデータオブジェクトにも直接リンクします。マルチプロセッシングを使用する場合私はあなたに、環境変数「MKL_NUM_THREADS」を設定することをお勧めします1ようにnumpyのが唯一の各プロセス/労働者のための1つのコア許可されている-そう、あなたがnumpyの平行との間でリソースの競合で終わる可能性マルチプロセッシングリード性能の低下へと。 マルチプロセッシングは、同じオペレーティングシステムの下でマルチCPU /マルチコアアーキテクチャに対して正常に機能します。4 x Xeon E7-4850 CPU(各10コア)と512 GBメモリを備えた共有メモリコンピュータでマルチプロセッシングを使用しましたが、非常にうまく機能しました。共有配列はmultiprocessing.Arrayまたはsharedctypesで処理できます。Pythonのドキュメントはこちらで確認できます。library.pdfファイル。この基本的な部分のいくつかを説明するスライドがあります-それらが必要な場合はPM

分散メモリを使用したクラスター構成の場合、mpi4pyが推奨ツールであると思われます。私自身はこれを使用していませんが、Python並列プログラミングで多く使用されていることを知っています。


3

それは、並列プログラミングしようとしているレベルに依存します。たとえば、行列/ベクトルの場合、Pythonでの最初の停止はNumPy / SciPy(それらは、Pythonの利便性を備えたライブラリの全速度を提供する数値ライブラリへのインターフェイスを提供します)および彼らが並列処理について書いていることからライブラリが並列使用のためにコンパイルされている場合、プログラムは特定の操作にマルチコアを利用します。(この記事は少し古いようですが、その間に物事は改善されたかもしれません。また、並列プログラミングの他の手段へのリンクがあります。

そしてもちろん、MPIを直接プログラムするためのmpi4pyがあります(上記の記事に含まれています)

私の一番下の行は、もしあなたの主な関心がベクトル/行列操作であり、並列処理があなたが「ただ」それを速くするだけの何かであるなら、あなたはNumPy / SciPy-ecosystemを見る必要があります。独自のライブラリの作成を検討する必要がある場合に必要なもの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.