はじめに
ご覧いただきありがとうございます。
このページは私が取り組んでいる研究で用いている並列処理のアウトプットとして
まとめさせていただきます。
今回はopenMPの使い方をまとめていきたいともいます。
openMP
OpenMP(Open Multi-Processing)とは共有メモリ型マシンで並列プログラミングを可能にする API
であり,Architecture Review Board(ARB)によって規定されている業界標準規格です。共有メモリ型並列計算機用のプログラムの並列化を記述するための指示文、ライブラリ関
数、環境変数などが規定されています.
openMPの特徴
並列プログラム(マルチスレッドプログラム)が簡単かつ短いコード量で記述できる。
・異なるシステム間でソースプログラムを共通化できるので移植性が高い。
・逐次プログラムから段階的に並列化していくことが可能である。
・同一のソースプログラムで並列環境と非並列環境を共存できる。
・コンパイラの自動並列化機能に比べてプログラムの高速化を達成し易い。
動作環境
M1 apple cilicon
gcc
使用言語
c言語
コンパイル方法
コンパイル時には** -fopenmp**オプションをつけてコンパイルします。
test.cをコンパイルする場合
gcc test.c -fopenmp
-oを用いる場合
gcc test.c -o test -fopenmp
実行方法
test.cをコンパイルして実行ファイルtestを作成した場合
./test
プログラム
openMP第1回目は基本的なコードを
並列化1
#include<stdio.h>
#include<omp.h>
int main(){
#pragma omp parallel
{
printf("Hello world\n");
}
return 0;
}
出力
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
解説
Hellow worldを出力する処理をコア数ぶん実行する並列化プログラム
私の使用しているPCは10コアなので10回出力されています。
macbookでは以下のコマンドで物理コア数を確認できます。
#ターミナルでCPU 物理コア数を確認するコマンド
sysctl -n hw.physicalcpu_max
#出力
10
並列化2
for文の並列化
繰り返しの処理を並列化させます。
#include<stdio.h>
#include<omp.h>
int main(){
int n=100,sum;
#pragma omp prallel for
{
for(int i=0; i<=n;i++){
sum+=i;
}
printf("結果 %d\n",sum);
}
return 0;
}
出力
結果 1497928635
解説
このプログラムは1から100までの和を計算するプログラムです。
1から100までの和は5050ですが出力は1497928635
答えが異なる理由
ランダムにsumに書き込んでしまっているため答えが誤っています。
private節
コアごとの初期化を防ぐ
reduction節
たし込み操作、集約の時に使う。
正しいプログラム
#include <stdio.h>
#include <omp.h>
int main() {
int sum = 0;
int i;
#pragma omp parallel for private(i) reduction(+:sum)
for (i = 0; i <= 100; i++) {
sum += i;
}
printf("結果: %d\n", sum);
return 0;
}
出力
結果: 5050
最後に
今回はopenMPの簡単な使い方を大雑把に解説しました。
次回はredction節とprivate句の詳しい使い方についてまとめて行きます。