1. 程式人生 > >40.多線程實現矩陣相乘

40.多線程實現矩陣相乘

分享圖片 num res 運行時 矩陣 for 統計 span fine

單線程運行時間:

技術分享圖片

多線程運行時間;

技術分享圖片

代碼:

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <Windows.h>
 5 #include <time.h>
 6 
 7 #define N 1000
 8 
 9 double M1[N][N] = { 0 };
10 double M2[N][N] = { 0 };
11 double res[N][N] = { 0 };
12 
13 //多線程函數,p表示行
14 void process(void
*p) 15 { 16 int *row = (int *)p; 17 18 //M2每一列 19 for (int j = 0; j < N; j++) 20 { 21 int tmp = 0; 22 //遍歷M2某列的元素 23 for (int k = 0; k < N; k++) 24 { 25 tmp += M1[*row][k] * M2[k][j]; 26 } 27 res[*row][j] = tmp; 28 } 29 }
30 31 //初始化矩陣 32 void init(double num[N][N]) 33 { 34 for (int i = 0; i < N; i++) 35 { 36 for (int j = 0; j < N; j++) 37 { 38 num[i][j] = rand() % 5 ; 39 } 40 } 41 } 42 43 //顯示矩陣 44 void show(double num[N][N]) 45 { 46 for (int i = 0; i < N; i++) 47
{ 48 for (int j = 0; j < N; j++) 49 { 50 printf("%.2f ", num[i][j]); 51 } 52 printf("\n"); 53 } 54 } 55 56 void main() 57 { 58 //統計時間 59 clock_t start, finish; 60 double duration = 0; 61 62 start = clock(); 63 init(M1); 64 init(M2); 65 //show(M1); 66 //show(M2); 67 int num1 = 0; 68 69 ////多線程 70 for (int i = 0; i < N; i++) 71 { 72 HANDLE hd = (HANDLE)_beginthread(process, 0, &i); 73 //WaitForSingleObject(hd, INFINITE); 74 } 75 76 //單線程 77 /*for (int i = 0; i < N; i++) 78 { 79 process(&i); 80 }*/ 81 82 finish = clock(); 83 duration = (double)(finish - start) / CLOCKS_PER_SEC; 84 printf("%f seconds\n", duration); 85 86 system("pause"); 87 }

40.多線程實現矩陣相乘