コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
OpenMP
」を編集中
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
'''OpenMP'''とは、数行の[[おまじない]]を書いて[[コンパイルオプション]]を追加するだけで、 多くの処理対象に対し同じような処理をする処理を早く終わらせることができるようになる[[定数倍高速化]]ツールである。 処理に使う[[コンピュータ]]の性能や使用する対象の[[ソースコード]]にもよるが、 使用しない場合に比べて大体処理時間を86~22%にできる。 ただし、使用しない場合より実行中の[[CPU]]使用率が高くなる。 また、[[高速化]]効果が得られず、逆に遅くなってしまう[[環境]]もあるので注意が必要である。 ==使用方法== <source lang="C"> #include <stdio.h> #include <stdlib.h> int get_flag(unsigned char* buf,int index) { return (buf[index>>3] & (1<<(7-(index&7)))); } void set_flag(unsigned char* buf,int index,int flag) { if(flag) { buf[index>>3]|=1<<(7-(index&7)); } else { buf[index>>3]&=~(1<<(7-(index&7))); } } int main(int argc,char* argv[]) { int calc_ryo=20; unsigned int calc_max; unsigned int calc2_max; unsigned char* calc_buffer; unsigned buffer_max; unsigned i,j; if(argc>1)sscanf(argv[1],"%d",&calc_ryo); if(calc_ryo<0 || calc_ryo>31)calc_ryo=20; calc_max=1u<<calc_ryo; calc2_max=1u<<((calc_ryo+1)/2); buffer_max=calc_max>>3; calc_buffer=malloc(buffer_max); if(calc_buffer==NULL)return 1; printf("max: %u\n",calc_max); for(i=0;i<buffer_max;i++)calc_buffer[i]=0xFF; set_flag(calc_buffer,0,0); set_flag(calc_buffer,1,0); for(i=2;i<=calc2_max;i++) { if(get_flag(calc_buffer,i)) { #ifdef _OPENMP #pragma omp parallel for #endif for(j=i+i;j<calc_max;j+=i) { set_flag(calc_buffer,j,0); } } } free(calc_buffer); return 0; } </source> 例えばこのコードのように、多くの対象に同じような処理をしているfor文の前に <pre>#pragma omp parallel for</pre> というおまじないを書く。そして、 <pre>>gcc -O2 -fopenmp -o prime.exe prime.c -static</pre> のように、コンパイルオプションに-fopenmpを追加する。 このことによりOpenMPが有効化され、実行時間が比較的短くなることが期待される。 ===注意点=== OpenMPは、多くの対象に、<strong>互いに関係ない</strong>同じような処理をしている場合の高速化に有効である。 処理が互いに関係ある場合、例えば値の合計を取るなどの場合は、特殊な書き方が必要である。 ==関連項目== <ul> <li>[[OpenMPI]] <li>[[OpenCL]] </ul>
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
本文の横幅制限を有効化/無効化