コンピュータ科学において、暗黙的並列処理とは、プログラミング言語の特性の一つであり、コンパイラやインタプリタが、言語の構成要素によって表現される計算に内在する並列性を自動的に活用できるようにするものです。明示的並列処理とは異なり、純粋な暗黙的並列言語は、並列実行を可能にするための特別なディレクティブ、演算子、関数を必要としません。
暗黙的な並列処理を備えたプログラミング言語には、Axum、Binary Modular Dataflow Machine (BMDFM)、High Performance Fortran (HPF)、Id、LabVIEW、MATLAB Mコード、NESL、Single Assignment C (SAC)、Streams and Iteration in a Single Assignment Language ( SISAL )、Z-level programming language (ZPL)、およびpHなどがあります。[ 1 ]
ある問題が、一連の数値に対して同じ演算(例えば、それぞれの数値の正弦や対数を順番に計算するなど)を実行することを含む場合、暗黙的な並列処理を提供する言語では、次のような命令を記述できる可能性があります。
numbers = [ 0 1 2 3 4 5 6 7 ]; result = sin ( numbers );コンパイラまたはインタプリタは、各要素の正弦を個別に計算することができ、利用可能な場合は複数のプロセッサに処理を分散させることができます。
暗黙的に並列処理を行うプログラマーは、タスクの分割やプロセス間の通信について心配する必要がなく、プログラムが解決しようとしている問題に集中できます。暗黙的な並列処理は一般的に並列プログラムの設計を容易にし、結果としてプログラマーの生産性を大幅に向上させます。
これを支えるために必要な多くの構成要素は、実際の並列処理がない場合でも、簡潔さや明瞭さを向上させます。上記の関数内のリスト内包sin()表記の例は、それ自体が有用な機能です。暗黙的な並列処理を用いることで、言語は必要な機能をサポートするためだけに、こうした有用な構成要素をユーザーに提供せざるを得なくなります(例えば、適切なforループを持たない言語は、ほとんどプログラマーが使わないでしょう)。
暗黙的な並列処理を備えた言語は、プログラマがプログラムの並列実行を制御する能力を低下させ、結果として並列効率が最適でなくなる場合がある。Oz 言語の開発者も、暗黙的な並列処理に関する初期の実験で、暗黙的な並列処理によってデバッグが困難になり、オブジェクト モデルが不必要に扱いにくくなることがわかったと述べている。[ 2 ]
より大きな問題は、すべてのプログラムには並列ロジックと直列ロジックの両方が含まれていることです。たとえば、バイナリ入出力Write()(I/O)では、やといった直列操作のサポートが必要です。暗黙的な並列処理が必要な場合、スレッド化Seek()や分散化できないコードをサポートするために、構文やキーワードに関する新たな要件が生じます。