Matrix Multiplication(C ++)中的OpenMP性能问题

时间:2016-11-06 19:34:07

标签: c++ matrix openmp matrix-multiplication

我一直在尝试使用OpenMP并行化有关Matrix Multiplication的代码。

void multiplicacionMatriz(const vector<vector<int> > &A, const vector<vector<int> > &B, vector<vector<int> > &C)
{
    if(A[0].size() != B.size())
    {
        cerr << "No se pueden multiplicar las matrices." << endl;
        exit(1);
    }
    unsigned int i, j, k, filasA, columnasB, comun;
    filasA = A.size();
    columnasB = B[0].size();
    comun= A[0].size(); 

    // PARELELIZACIÓN BUCLE FOR
    #pragma omp parallel for collapse(3) num_threads(8)
    for (i = 0; i < filasA; i++) 
    {
        for (j = 0; j < columnasB; j++)
        {
            // C[i][j] = 0; Ya inicializados a 0
            for (k = 0; k < comun; k++) 
            {
                C[i][j] = C[i][j] + (A[i][k] * B[k][j]); 
            }
        }
    }
}

我一直在用不同的矩阵尺寸进行测试,而且我现在已经取得了不错的成绩(平均多次运行):

  • 1000x1000:5秒而不是20秒。
  • 1500x1500:20秒而非80秒。
  • 2000x2000:25秒而不是200。

我尝试用更大的矩阵尺寸测试它,但乘法时间不会像预期的那样增加......它会减少:2500x2500我得到15秒而5000x5000得到3秒一个小时! 我得到了更大尺寸的以下结果(这些已经尝试过一次或两次):

  • 7500x7500:9秒。
  • 10000x10000:38秒。
  • 15000x15000:59秒。

这是正常的吗?如何比两个2000x2000更快地倍增两个7500x7500矩阵。我没想到这些结果,我现在很失落。任何见解都表示赞赏!

矩阵初始化

每个矩阵是向量的向量。我将每个值初始化为0。

// Pedimos la dimensión de las matrices a procesar.
cout << "Inserte la dimensión (cuadrada) de la matriz: ";
cin >> dimension;

// Matrices auxiliares
vector<vector<int> > A(dimension, std::vector<int>(dimension,0)), B(dimension, std::vector<int>(dimension,0)), C(dimension, std::vector<int>(dimension,0));
vector<vector<int> > CModificado(dimension, std::vector<int>(dimension,0));

更新1

我已经更改了我的代码,因此我只会折叠循环的内部循环,并且它已经正常工作以获得更大的价值。

// PARELELIZACIÓN BUCLE FOR
//#pragma omp parallel for collapse(3) num_threads(8)
for (unsigned int i = 0; i < filasA; i++) 
{
    #pragma omp parallel for collapse(2) num_threads(8)
    for (unsigned int j = 0; j < columnasB; j++)
    {
        // C[i][j] = 0; Ya inicializados a 0
        for (unsigned int k = 0; k < comun; k++) 
        {
            C[i][j] = C[i][j] + (A[i][k] * B[k][j]); 
        }
    }
}

这使得结果更加正常,随着时间的推移逐渐增加,而不是像之前那样无关紧要

  • 1000x1000平均5.2秒
  • 1500x1500,平均20秒
  • 2000x2000平均48.2秒
  • 2500x2500,平均100秒

0 个答案:

没有答案