» www.Giftbox.Az - Bir birindən gözəl hədiyyə satışı
ウィキペディアランダム
毎日カテゴリ
共有: WhatsappFacebookTwitterVK

OpenMP

OpenMP(オープンエムピー)は、並列計算機環境において共有メモリ・マルチスレッド型の並列アプリケーションソフトウェア開発をサポートするために標準化されたAPIである[2]。「OpenMP」は「open multiprocessing」の略である[2]

OpenMP
開発元 OpenMP ARB
最新版
5.2 / 2021年11月 (1年前) (2021-11)[1]
プラットフォーム クロスプラットフォーム
対応言語 C/, Fortran
種別 並列プログラミングAPI、言語拡張
公式サイト www.openmp.org
(テンプレートを表示)

同様に並列コンピューティングに利用されるMPIでは、メッセージの交換をプログラム中に明示的に記述しなければならないが、OpenMPではディレクティブを挿入することによって並列化を行う。OpenMPが使用できない環境では、このディレクティブは無視されるため、並列環境と非並列環境でほぼ同一のソースコードを使用できるという利点がある。また、プラットフォーム固有のスレッドAPIを使わず、コンパイラによって暗黙的に生成されたスレッドプールを利用してタスクを振り分けることになるため、並列プログラムを簡潔に記述できるだけでなく、複数の環境に移植しやすくなる。

MPIとの比較では、OpenMPは異なるスレッドが同一のデータを同じアドレスで参照できるのに対して、MPIでは明示的にメッセージ交換を行わなければならない。そのため、OpenMPは、SMP環境においては大きなデータの移動を行なわずにすむので高い効率が期待できる。ただし並列化の効率はコンパイラに依存するので、チューニングによる性能改善がMPIほど高くならないという問題がある。また、OpenMPはMPIに比べてメモリアクセスのローカリティが低くなる傾向があるので、頻繁なメモリアクセスがあるプログラムでは、MPIの方が高速な場合が多い[要出典]

OpenMPは、並列プログラミングにおいて最も広く利用されているAPIであるが、共有メモリに対して(Uniform Memory Access)(英語版)に近いアクセスができるハードウェアシステムアーキテクチャでは、スケーラビリティに限界がある[2]。そのため、現在のほとんどのスーパーコンピューターでは、OpenMP単独ではなく、分散メモリ環境で高いスケーラビリティを発揮するMPIと組み合わせた、ハイブリッドMPI+OpenMPが利用されている[2][3]

現在FORTRANC/について標準化が行われている。

OpenMPを用いたコード例

以下はC言語における for ループを並列処理させる例である。

int main(int argc, char *argv[]) {  int i; #pragma omp parallel for  for (i = 0; i < 10000; ++i)  {  /* (並列処理させたいプログラム) */  }  return 0; } 

OpenMPはループの反復処理を自動的に複数のスレッドに分割して並行処理できるようにする。例えば4つのスレッドを用いて処理を分割する場合、上記例ではインデックス[0, 2499], [2500, 4999], [5000, 7499], [7500, 9999]の各範囲をそれぞれのスレッドに分担させる、といった具合である。実際にいくつのスレッドを起動するのか、また各スレッドに対してどのように処理を振り分けるのかはOpenMP処理系およびプログラム実行環境などの条件に依存する[4]

以下は区分求積法を用いた円周率πの数値計算を、OpenMP並列リダクションによって行なうC++のコード例である。

#include <iostream> #include <chrono> #include <cmath> #include <iomanip> #include <omp.h> const double D_PI = 3.1415926535897932384626433832795; // 区分求積法で π の近似値を求める。 // 1 / (x^2 + 1) を区間 [0, 1] で積分すると π/4 になるという定積分を利用する。 int main() {  const int DivNum = 1000 * 1000 * 1000;  const double delta = 1.0 / DivNum;  std::cout << "OpenMP max threads count = " << omp_get_max_threads() << std::endl;  const auto startTime = std::chrono::system_clock::now();  double sum = 0; #pragma omp parallel for reduction(+ : sum)  for (int i = 0; i < DivNum; ++i)  {  const double x = (delta * i);  const double area = delta * 1.0 / (x * x + 1.0);  sum += area;  }  const double pi = sum * 4.0;  const auto endTime = std::chrono::system_clock::now();  std::cout << std::setprecision(15) << "PI ~= " << pi << std::endl;  std::cout << "Error [%] = " << (100.0 * std::fabs(D_PI - pi) / D_PI) << std::endl;  std::cout << "Elapsed time [ms] = " << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count() << std::endl;  return 0; } 

OpenMPコンパイルオプションの有無を切り替えるか、OpenMPディレクティブをコメントアウト/コメント解除してからコンパイル・実行することで、マルチスレッド版およびシングルスレッド版の速度性能比較を簡単に行なうことができるのがOpenMPプログラムの特徴である。

対応コンパイラ

  • GCC:バージョン4.9時点でOpenMP 4.0をサポートしている[5]。GCC 5ではオフロード機能のサポートが追加された。
  • Clang:3.7でOpenMP 3.1に対応した[6]。Clang 3.7以前は派生プロジェクトが存在した[7]
  • :Visual C++ 2017時点でOpenMP 2.0をサポートしている[8]。Visual C++ 2019ではSIMD並列化機能を実験的にサポートする[9]
  • :バージョン12.1においてOpenMP 3.1をサポートしている。また、バージョン14.0においてOpenMP 4.0の機能を一部サポートしている[10]
  • (Intel Fortran Compiler)(英語版): バージョン18.0以降でOpenMP 5.0の機能の大部分をサポートしている[11]

脚注

  1. ^ OpenMP Application Programming Interface Version 5.2
  2. ^ a b c d Sterling, Thomas,. High performance computing : modern systems and practices. Anderson, Matthew,, Brodowicz, Maciej,. Cambridge, MA. ISBN (9780124202153). OCLC 1013816564. https://www.worldcat.org/oclc/1013816564 
  3. ^ Rabenseifner, R.; Hager, G.; Jost, G. (2009-2). “Hybrid MPI/OpenMP Parallel Programming on Clusters of Multi-Core SMP Nodes”. 2009 17th Euromicro International Conference on Parallel, Distributed and Network-based Processing: 427–436. doi:10.1109/PDP.2009.43. https://ieeexplore.ieee.org/document/4912964/. 
  4. ^ OpenMP* 入門 | iSUS
  5. ^ openmp - GCC Wiki
  6. ^ “Clang 3.7 Release Notes — Clang 3.7 documentation” (英語) (2017年6月4日). 2017年6月4日閲覧。
  7. ^ OpenMP®/Clang
  8. ^ OpenMP in Visual C++ | Microsoft Docs
  9. ^ /openmp (Enable OpenMP Support) | Microsoft Docs
  10. ^ OpenMP* 4.0 Features in Intel C++ Composer XE 2013 | Intel® Developer Zone
  11. ^ インテル® Fortran および C++ コンパイラーで実装される OpenMP* 機能の調査 | iSUS

関連項目

参考文献 (学習用)

  • Rohit Chandra, Ramesh Menon, Leo Dagum, David Kohr, Dror Maydan and Jeff McDonald: "Parallel Programming in OpenMP", Morgan Kaufmann, (ISBN 978-1558606715) (2000年10月).
  • Barbara Chapman, Gabriele Jost and Ruud Van der Pas: "Using OpenMP: Portable Shared Memory Parallel Programming", MIT Press, (ISBN 978-0-262-53302-7) (2007年10月).
  • Ruud van der Pas, Eric Stotzer and Christian Terboven: "Using OpenMP -- The Next Step: Affinity, Accelerators, Tasking, and SIMD", MIT Press, (ISBN 978-0262344005) (2017年10月27日). ※ OpenMP 4.5 の仕様を記述。
  • Timothy G. Mattson, Yun (Helen) He, and Alice Evelyn Konigs: "The OpenMP Common Core: Making OpenMP Simple Again", MIT Press, (ISBN 978-0262538862) (2019年11月19日).
  • 牛島 省:「OpenMPによる並列プログラミングと数値計算法」、丸善、(ISBN 978-4621077177) (2006年5月).
  • 黒田久泰:「C言語によるOpenMP入門」、東京大学情報基盤センター スーパーコンピューティングニュース、Vol.9, No. Special Issue 1 (2008), pp.149-168
  • 佐藤三久:「OpenMP並列プログラミング入門」、筑波大学計算科学センター(2010)
  • 菅原 清文:「C/C++ プログラマーのための OpenMP 並列プログラミング」、第2版、カットシステム、(ISBN 978-4-87783-223-0) (2012年6月).
  • 片桐孝洋:「並列プログラミング入門:サンプルプログラムで学ぶOpenMPとOpenACC」、東京大学出版会、(ISBN 978-4130624565) (2015年5月29日).
  • 片桐孝洋:「OpenMPの基礎」、名古屋大学情報基盤センター、計算科学技術特論A第3回(2017年度)
  • 北山洋幸:「OpenMP基本と実践―メニ―コアCPU時代の並列プログラミング手法」、カットシステム、(ISBN 978-4877834494) (2018年10月1日).

外部リンク

  • OpenMP
    • Specifications - OpenMP
    • OpenMP Architecture Review Board: "OpenMP Application Programming Interface Specification Version 5.0", (2018年11月)
  • OpenMP入門 - Fortran利用者向け (NAG社)
  • HPCプログラミングセミナーで使用する資料の公開ページです。(HPCI=High Performance Computing Initiative、日本)
  • 「OpenMPによるマルチコア・メニィコア並列プログラミング入門」(東京大学情報基盤センター講習会資料)
  • Victor Eijkhout : Parallel Programming for Science Engineering The Art of HPC, volume 2 (HTML version)
ウィキペディア、ウィキ、本、library、論文、読んだ、ダウンロード、自由、無料ダウンロード、mp3、video、mp4、3gp、 jpg、jpeg、gif、png、画像、音楽、歌、映画、本、ゲーム、ゲーム。