C
1#include <stdio.h>2#include <stdlib.h>3#include<pthread.h>4 5#define SIZE 10246#define PRINT_SIZE 87#define THREAD_NUM 2 //分割する数8 9#include <pthread.h>10typedef struct {11int start, end, ans[SIZE][SIZE];12} arg_t;//並列化に関わる構造体13 14 15// matrix[row][col]16int a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE];17 18 19//Aの生成を分割できるように変更20void init_a(int mat[SIZE][SIZE],int R_start,int R_end){21 int row, col;22 for (row = R_start ; row < R_end ; row++){23 for (col = 0 ; col < SIZE ; col++){24 mat[row][col] = row+1;25 }26 }27}28void init_b(int mat[SIZE][SIZE]){29 int row, col;30 for (row = 0 ; row < SIZE ; row++){31 for (col = 0 ; col < SIZE ; col++){32 mat[row][col] = row+col+1;33 }34 }35}36 37void print_matrix_sub(int mat[SIZE][SIZE], int size, int abbr, int start_row){38 int row, col;39 40 for (row = start_row ; row < start_row+size ; row++){41 for (col = 0 ; col < size ; col++){42 printf("%4d ", mat[row][col]);43 }44 if (abbr){45 printf(" ... ");46 for (col = SIZE-size ; col < SIZE ; col++){47 printf("%4d ", mat[row][col]);48 }49 50 }51 printf("\n");52 }53}54 55void print_matrix(int mat[SIZE][SIZE]){56 int size, abbr;57 58 if (SIZE > PRINT_SIZE){59 size = PRINT_SIZE/2;60 abbr = 1;61 }62 else {63 size = SIZE;64 abbr = 0;65 }66 67 print_matrix_sub(mat, size, abbr, 0);68 if (abbr){69 printf(" ...\n");70 print_matrix_sub(mat, size, abbr, SIZE-size);71 }72}73 74//不要な部分は計算しない。75void matmul(int a[SIZE][SIZE], int b[SIZE][SIZE], int c[SIZE][SIZE],int start,int end){76 int row, col, k, s;77 for (row = start ; row < end ; row++){78 for (col = 0 ; col < SIZE ; col++){79 s = 0;80 for (k = 0 ; k < SIZE ; k++){81 s += a[row][k]*b[k][col];82 }83 c[row][col] = s;84 }85 }86}87 88//最後にスレッド合流後にcに格納するために追加。89void Assmat(int vessel[SIZE][SIZE],int element[SIZE][SIZE],int start,int end){90 int row,col;91 for (row = start ; row < end ; row++){92 for (col = 0 ; col < SIZE ; col++){93 vessel[row][col] = element[row][col];94 }95 }96 97}98 99//スレッドで動かす関数100void *f(void *varg){101 int tmp_a[SIZE][SIZE],tmp_b[SIZE][SIZE];102 arg_t *arg = (arg_t *)varg;103 init_a(tmp_a,arg->start,arg->end);104 init_b(tmp_b); 105 matmul(tmp_a,tmp_b,arg->ans,arg->start,arg->end);106 return NULL;107}108 109 110int main(void){111 int i;112 init_a(a,0,SIZE);113 init_b(b);114 printf("A\n");115 print_matrix(a);116 printf("\nB\n");117 print_matrix(b);118 pthread_t th[THREAD_NUM];119 arg_t arg[THREAD_NUM];120 for(i = 0;i < THREAD_NUM;i++){121 arg[i].start = i*(SIZE/THREAD_NUM);122 arg[i].end = (i+1)*(SIZE/THREAD_NUM);123 //printf("%d to %d\n",arg[i].start,arg[i].end);//デバッグ用の出力124 pthread_create(&th[i],NULL,f,&arg[i]);125 }126 for(i = 0; i<THREAD_NUM; i++){127 pthread_join(th[i],NULL);128 Assmat(c,arg[i].ans,arg[i].start,arg[i].end);129 }130 printf("\nC = AB\n");131 print_matrix(c);132 return 0;133}134

0 コメント