質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

並列処理

複数の計算が同時に実行される手法

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

0回答

1235閲覧

OpenMPを用いた並列処理

W_H_O

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

並列処理

複数の計算が同時に実行される手法

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/12/11 09:39

編集2020/12/11 11:25

C言語の初学者でOpenMPを使った並列処理(行列積)を試しており基本的なことが分からずつまずいています。

最内ループと最外ループの意味が分からず、並列化する場合にどこに#pragma omp parallel for(private指示節を用いる)を入れればいいかが分かりません。

最内ループを作る場合、行列の積の計算のどこに#pragma omp parallel forを入れればいいのかまた最内ループが並列化できる条件とその理由
最外ループを作る場合、行列の積の計算のどこに#pragma omp parallel forを入れればいいのかまた最内ループが並列化できる条件とその理由、をおしえていただきたいです。

程度の低い質問ですいません...

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <omp.h> 4#include "jikken.h" 5 6int main(int argc, char *argv[]) 7{ 8 9 int size; 10 11 if ((argc != 2) || (size=atoi(argv[1]))<=0) { 12 fprintf(stderr,"Invalid Argument\n"); 13 exit(1); 14 } 15 /*行の確保する式*/ 16 double **mx = (double**)malloc(sizeof(double*) * size); 17 double **my = (double**)malloc(sizeof(double*) * size); 18 double **mz = (double**)malloc(sizeof(double*) * size); 19 20 /*一行分のデータの保持する領域を確保する式*/ 21 for(int i =0;i<size;i++){ 22 mx[i] = (double*)malloc(sizeof(double) * size); 23 my[i] = (double*)malloc(sizeof(double) * size); 24 mz[i] = (double*)malloc(sizeof(double) * size); 25 } 26 27 make_matrix(size,1,mx,my,52); 28 29 double st = 0; 30 double ed = 0; 31 32 omp_set_num_threads(2); 33 34 printf("実行スレッド数: %d\n",omp_get_max_threads()); 35 36 double omp_get_wtime(); 37 int j,k; 38 39 st=omp_get_wtime(); 40 41 42 for(int i=0;i<size;i++){ 43 44 45 for(j=0;j<size;j++){ 46 47 mz[i][j] = 0; 48 49 for(k=0;k<size;k++){ 50 51 mz[i][j] += mx[i][k] * my[k][j]; 52 } 53 54 } 55 56 } 57 58 ed=omp_get_wtime(); 59 60 61 printf("経過時間 %.2f秒\n",ed-st); 62 63 check_matrix(size,mz,52); 64 65 66 67 free(mx); 68 free(my); 69 free(mz); 70 71 return 0; 72} 73 74 75 76 77 78

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/12/12 01:03

https://www.hpci-office.jp/materials/openmp_2014-01-15.pdf の49, 50ページに書いてあるように、最外周のループを並列化した方が、生成されるスレッド数が減るため効率的なので、それで支障が無ければそうすると思います ただし、外周のループは並列化できない場合は、しかたないので内周のループを並列化します 上記資料の38〜42ページをご覧ください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問