多线程读取矩阵文件+多线程矩阵乘法(C++实现) 快来打我* 2022-05-23 10:37 189阅读 0赞 ## 算法概述 ## * 矩阵乘法可以在算法层面上进行并行。 * **vector< vector > Mat\[3\];** 这个二维向量数组就是来放做矩阵乘法中的那些矩阵的。Mat\[0\]是矩阵A,Mat\[1\]是矩阵B,Mat\[2\]是乘法的结果矩阵。所以下图中关于这个就做了类似的修改。 * **readMat**就是用来读取特定的矩阵。注意,这里的target矩阵要用指针,如果改成用引用的模式,就会报错。这可能跟引用的机制有关,具体没有深入研究过。 * **run\_test\_parallel**函数就是用来算结果矩阵的每一行的。 * **filenames**这个数组,用来放文件名。(**注意,需要使用const char\* \[\]**) * **vt.clear();**结束之后,记得将这个线程向量给clear掉,后面也用到了。节省空间。 * **if (Mat\[0\]\[0\].size() == Mat\[1\].size())** 是用来判断是否可以进行矩阵乘法的。 * 之后初始化结果矩阵的时候,算法复杂度是**O(a+c)**,而不是一般认为的**O(a\*c)** * 再来就是计算矩阵乘法,并输出结果了。 ## 程序 ## #include <iostream> #include <vector> #include <fstream> #include <thread> using namespace std; vector< vector<int> > Mat[3]; void readMat(const char* filename, vector< vector<int> >* target) { int a, b, c; ifstream in(filename); in >> a >> b; for (int i = 0; i < a; ++i) { vector<int> temp; for (int j = 0; j < b; ++j) { in >> c; temp.push_back(c); } (*target).push_back(temp); temp.clear(); } in.close(); } void run_test_parallel(int row_index, int column_cntA, int column_cntB) { // Go over every column of matrixB for (int i = 0; i<column_cntB; i++) { // to compute every element of (row_index)-th row of answer Mat[2][row_index][i] = 0; // Compute the answer // Number of columns in A = Number of rows in B for (int j = 0; j<column_cntA; j++) Mat[2][row_index][i] += Mat[0][row_index][j] * Mat[1][j][i]; } } int main() { const char *filenames[] = { "1.txt", "2.txt" }; vector<thread> vt; for (int i = 0; i < 2; ++i) vt.push_back(thread(readMat, filenames[i], &Mat[i])); for (int i = 0; i < 2; ++i) vt[i].join(); vt.clear(); if (Mat[0][0].size() == Mat[1].size()) { int a = Mat[0].size(), b = Mat[1].size(), c = Mat[1][0].size(); vector<int> temp; for (int j = 0; j < c; ++j) temp.push_back(0); for (int i = 0; i < a; ++i) Mat[2].push_back(temp); // Create a threads, because there are a rows in Mat[0] // Each thread will be running function "run_test_parallel" for (int i = 0; i<a; i++) vt.push_back(thread(run_test_parallel, i, b, c)); for (int i = 0; i<a; i++) vt[i].join(); for (int i = 0; i < 2; ++i) { for (int j = 0; j < Mat[i].size(); ++j) { for (int k = 0; k < Mat[i][j].size(); ++k) { cout << Mat[i][j][k] << " "; } cout << endl; } if (i == 0) cout << "MULTIPLED\n"; else cout << "EQUAL TO --->\n"; } for (int i = 0; i < a; ++i) { for (int j = 0; j < c; ++j) { cout << Mat[2][i][j] << " "; } cout << endl; } } else { cout << "Can't Multiple!!\n"; } system("pause"); return 0; }
相关 C# 多线程 线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。 线 逃离我推掉我的手/ 2024年03月22日 23:54/ 0 赞/ 78 阅读
相关 C++多线程 目录 一、C++线程库 1. 认识thread类 2. 线程函数的参数 3. this\_thread 二、原子操作 快来打我*/ 2023年09月24日 20:29/ 0 赞/ 132 阅读
相关 多线程_多线程总结 1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单 爱被打了一巴掌/ 2022年09月28日 15:23/ 0 赞/ 327 阅读
相关 C++多线程 > Talk is cheap, show me the code. C++语言本身没有提供多线程的机制,但是不同的操作系统都提供了多线程的实现接口。使用C++编程时只需要去 ╰半夏微凉°/ 2022年07月13日 04:42/ 0 赞/ 648 阅读
相关 多线程读取矩阵文件+多线程矩阵乘法(C++实现) 算法概述 矩阵乘法可以在算法层面上进行并行。 vector< vector > Mat\[3\]; 这个二维向量数组就是来放做矩阵乘法中的那些矩阵的。Mat\ 快来打我*/ 2022年05月23日 10:37/ 0 赞/ 190 阅读
相关 C# 多线程 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlbmd5 偏执的太偏执、/ 2021年12月21日 19:53/ 0 赞/ 326 阅读
相关 c++多线程 1、代码 //thread.cpp include <iostream> include <pthread.h> //多线程相关操作头文件,可移植众多 Myth丶恋晨/ 2021年12月19日 04:23/ 0 赞/ 329 阅读
相关 C#线程 多线程 进程 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源. 应用程序域: 使用.NET建立的可执行程序 \.exe,并没有直接承载到进程 分手后的思念是犯贱/ 2021年11月06日 00:38/ 0 赞/ 451 阅读
相关 C# 多线程 多线程的目的 1. 让计算机“同时”执行多件事情。 2. 后台运行程序,不会影响到主界面的操作。 3. 解决单线程出现“假死”的现象。 线程关键词 创建新线 落日映苍穹つ/ 2021年10月18日 07:46/ 0 赞/ 318 阅读
相关 C#多线程 [C\多线程][C] 一、基本概念 1、进程 首先打开任务管理器,查看当前运行的进程: ![466813425adeab78307836084a9e6af4.png 快来打我*/ 2021年09月21日 13:20/ 0 赞/ 360 阅读
还没有评论,来说两句吧...