40.多线程实现矩阵相乘

Posted 喵小喵~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了40.多线程实现矩阵相乘相关的知识,希望对你有一定的参考价值。

单线程运行时间:

多线程运行时间;

代码:

 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.多线程实现矩阵相乘的主要内容,如果未能解决你的问题,请参考以下文章

并行计算——OpenMP加速矩阵相乘

多线程基准测试问题

Java中的多线程矩阵乘法

算法导论—矩阵链乘法(动态规划)

在 C++ 中将两个矩阵相乘

c语言实现矩阵相乘