C言語のプログラムで行列の積をマルチスレッド化したいと考えてします。
使用するライブラリはpthreadで、行列の行ごとの計算を並列化させたいです。
実際に書いてみたプログラムは以下の通りです。
自分の環境(WSL2 Ubuntu20.04)では実行のたびに結果が変わってしまうのですが、
並列化プログラムとしてどのような点が間違っているのか教えていただきたいです!
c
1#include <stdio.h> 2#include <pthread.h> 3 4#define N 5 5const int A[N][N] = {1, 1, 1, 1, 1, 6 2, 2, 2, 2, 2, 7 3, 3, 3, 3, 3, 8 4, 4, 4, 4, 4, 9 5, 5, 5, 5, 5}; 10const int B[N][N] = {3, 2, 1, 4, 5, 11 1, 2, 3, 4, 5, 12 4, 5, 6, 1, 2, 13 3, 4, 5, 6, 7, 14 5, 4, 3, 2, 1}; 15int ans[N][N] = {}; 16 17void *func(void *arg); 18 19int main(int argc, char *argv[]) 20{ 21 pthread_t th[N]; 22 int i, j; 23 24 for (i = 0; i < N; i++) 25 pthread_create(&th[i], NULL, func, (void *)&i); 26 27 for (i = 0; i < N; i++) 28 pthread_join(th[i], NULL); 29 30 for (i = 0; i < N; i++) 31 { 32 for (j = 0; j < N; j++) 33 { 34 printf("%3d ", ans[i][j]); 35 } 36 printf("\n"); 37 } 38 39 return 0; 40} 41 42void *func(void *arg) 43{ 44 45 int i, j, row = *(int *)arg; 46 ; 47 48 for (i = 0; i < N; i++) 49 { 50 for (j = 0; j < N; j++) 51 { 52 ans[row][i] += A[row][j] * B[j][i]; 53 } 54 } 55 pthread_exit(NULL); 56}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。