并行矩阵乘法

  • z1_948202
    了解作者
  • 2.2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-30 10:26
    上传日期
基于Pthread的多线程并行矩阵乘法,包含1000*1000矩阵随机矩阵生成代码,和串行矩阵乘法的比较,c++实现,Windows系统。
并行矩阵乘法.zip
  • 并行矩阵乘法
  • pthreadMatrixMult.cpp
    1.8KB
  • randMatrix.cpp
    405B
  • commonMatrixMult.cpp
    1.3KB
内容介绍
#include<iostream> #include<cstdlib> #include<fstream> #include<pthread.h> #include<memory.h> #include<Windows.h> const int length=1000; const int count_thread=4; //通过调节该值来控制并发数 using namespace std; int *data_a[length]; //声明用于计算和储存结果的变量 int *data_b[length]; int *result[length]; int start[length]; void init() //数据初始化,从文件中读取数据 { ifstream fin("dataA.txt"); ifstream fin2("dataB.txt"); for(int i=0;i<length;i++) { for(int j=0;j<length;j++) { fin >> data_a[i][j]; fin2 >> data_b[i][j]; } } fin.close(); fin2.close(); } void* calc(void* start_t) //矩阵乘法的运算 { int* tmp = (int*)start_t; int start=*tmp; int end = start+length/count_thread; for(int i=start;i<end;i++) { for(int j=0;j<length;j++) { for(int k=0;k<length;k++) result[i][j] += data_a[i][k]*data_b[k][j]; } } } void pthread() { pthread_t *threads; threads = (pthread_t*)malloc(count_thread*sizeof(pthread_t)); int rank = length/count_thread; for(int i=0;i<count_thread;i++) { start[i] = i*rank; void* tmp=(void*)&start[i]; pthread_create(&threads[i],NULL,calc,tmp); } for(int i=0;i<count_thread;i++) pthread_join(threads[i],NULL); free(threads); } int main() { DWORD dwStart = GetTickCount(); for(int i=0;i<length;i++) { data_b[i] = (int*)malloc(sizeof(int)*length); //为各个变量分配空间 data_a[i] = (int*)malloc(sizeof(int)*length); result[i] = (int*)malloc(sizeof(int)*length); memset(result[i],0,length); //初始化内存空间 } init(); pthread(); ofstream out("result.txt"); for(int i=0;i<length;i++) { for(int j=0;j<length;j++) out << result[i][j] << " "; } DWORD dwUsed = GetTickCount() - dwStart; cout<<dwUsed<<" ms"<<endl; return 0; }
评论
    相关推荐