C ++中的并行矩阵乘法

时间:2016-02-21 07:19:42

标签: parallel-processing matrix-multiplication

我正在尝试在C ++中实现并行多线程矩阵乘法。我遵循的方法包括将Arrays分成4个子阵列,并在这4个子阵列上使用4个线程进行并行乘法。

我编写了一个C ++代码,但它会抛出错误并明确终止。错误: “在抛出std :: system_error的实例后终止调用 what():无效参数“

这是我的完整代码。我对C ++和多线程比较陌生。

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <algorithm>
#include <string>

#define N 4
using namespace std;
mutex mu;

void stage_1_multiply(int *a,int *b,int *d){
int *xij;
int *yij;
int *zij;
int COLS = N,ROWS = N;
cout<< " thread "<< this_thread::get_id() << " "<<endl;

    for(int i = 0;i<(N/2);++i){
        for(int j = 0;j < (N/2); j++){
                for(int k = 0; k<(N/2);k++){
                        mu.lock();
                        xij = a + ((COLS * i) + k);
                        yij = b + ((COLS * k) + j);
                        zij = d + ((COLS * i) + j);
                        *zij += ( (*xij) * (*yij) );
                        mu.unlock();
                }
        }
    }
}


int main(){
int A[4][4],B[4][4],C[4][4],D_1[4][4],D_2[4][4];

for(int i = 0;i<4;i++){
        for(int j = 0;j<4;j++){
            A[i][j] = i + 1;
            B[i][j] = i + 1;
            C[i][j] = 0;
            D_1[i][j] = 0;
            D_2[i][j] = 0;
        }
}
for(int i = 0;i<4;i++){
        for(int j = 0;j< 4;j++){
            cout << A[i][j] << " ";
        }
     cout << endl;
}
for(int i = 0;i<4;i++){
        for(int j = 0;j< 4;j++){
            cout << B[i][j] << " ";
        }
     cout << endl;
}

vector< thread> threads(8);
int th = 0;
threads[th++] = thread(stage_1_multiply,&A[0][0],&B[0][0],&D_1[0][0]);
threads[th++] = thread(stage_1_multiply,&A[0][2],&B[2][0],&D_2[0][0]);
threads[th++] = thread(stage_1_multiply,&A[2][0],&B[0][2],&D_1[2][2]);
threads[th++] = thread(stage_1_multiply,&A[2][2],&B[2][2],&D_2[2][2]);
for( auto& t : threads){
        t.join();
}
threads[th++] = thread(stage_1_multiply,&A[0][0],&B[0][2],&D_1[0][2]);
threads[th++] = thread(stage_1_multiply,&A[0][2],&B[2][2],&D_2[0][2]);
threads[th++] = thread(stage_1_multiply,&A[2][0],&B[0][0],&D_1[2][0]);
threads[th++] = thread(stage_1_multiply,&A[2][2],&B[2][0],&D_2[2][0]);

for( auto& t : threads){
        t.join();
}

// code to add The Matrices D_1 and D_2 goes here. 
for(int i = 0;i<4;i++){
        for(int j = 0;j< 4;j++){
            cout << D_1[i][j] << " ";
        }
     cout << endl;
}
cout << " Main Close "<<endl;
return 0;

}

出错了什么?它是否与共享内存的并行访问有关?如果是这样,我怎么能纠正它?

PS:这是作业作业。

0 个答案:

没有答案