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
あなたの回答
tips
プレビュー