週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

これで解決!OpenMPを使いたいのに"omp.h" not found 【Mac】


f:id:aisakakun:20151217142025p:plain

 

どのサイトを見てもイマイチわからない。"omp.h"が早く使いたい。私も本日やっと使えるように設定することができたので、ここに書いていきます。

事前準備

まずは、この下の記事の通り、順番に行ってください。

qiita.com

これできちんとできましたか?できた人は、おめでとうございます。

できなかった人は、私と同じ状況だと思いますのでこのまま読み進めましょう。

Fortran compiler...no

どこでできなかったかを考えると、

コンパイルの設定ファイル(Makefile)を生成

 のところなんですよね。ここで順調に終わったかと思いきや、no no noと見えます。

f:id:aisakakun:20151217140415p:plain

????

f:id:aisakakun:20151217140432p:plain

 

Fortran program が動きません? ということでFortranを入れましょう。

Fortranを入れる

Mac OS XでFortranを使う - Y. Kawamoto

↑このサイトに飛びましょう。このサイトの

MacPortsgccをインストール 

 の後に、「sudo port install gcc49」と行うところがあるのですが、port がないと言われますか?言われた場合は、

2.2. Install MacPorts 

ここで、2.2.2まで完了させると、portコマンドが使えるようになります。

そして、また

Mac OS XでFortranを使う - Y. Kawamoto

ここに戻って最後の5番まで実行します。(これでもportが使えないという人は、一度ターミナルを閉じて、また開いてください。そうすると使えるはずです。)

最後の

gfortran -v

で反応が返ってきたらfortranを入れることに成功したことになります。おめでとうございます。あとはまた、

qiita.com

ここに戻って、コンパイルしてインストールまで終わらせてください。その下の項目に「pathを通す」とありますが、私の場合は、すでにpathが通っていたためこの作業は行いませんでした。

確認用プログラム

omp.h は果たして入ったのか!?確認のために、このプログラムを実行してみてください。

#include <iostream>

#include <omp.h>
#include<time.h>

int main(){

clock_t t1,t2,t3,t4;
double A = 0;
double B = 0;

t3 = clock();
for(int i=0; i<100; i++){
for(int j=0; j<100; j++){
B+= (i+j);
}
}
t4 = clock();
printf("%f\n",(double)(t4-t3)/CLOCKS_PER_SEC);


t1 = clock();
#pragma omp parallel for private(j)
for(int i=0; i<100; i++){
for(int j=0; j<100; j++){
A += (i+j);
}
}
t2 = clock();
printf("%f\n",(double)(t2-t1)/CLOCKS_PER_SEC);


return (0);
}

これがちゃんと動けば、使用できています!

追記

OpenMPのomp_get_thread_num()こういうのを使う場合は、

c++  -fopenmp ~~~~.cpp

としてコンパイルしてください。詳しくは、ここに疑問と解決法があります。

stackoverflow.com

Pythonスタートブック

Pythonスタートブック