我一直在尝试使用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]);
}
}
}
}
我一直在用不同的矩阵尺寸进行测试,而且我现在已经取得了不错的成绩(平均多次运行):
我尝试用更大的矩阵尺寸测试它,但乘法时间不会像预期的那样增加......它会减少:2500x2500我得到15秒而5000x5000得到3秒一个小时! 我得到了更大尺寸的以下结果(这些已经尝试过一次或两次):
这是正常的吗?如何比两个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]);
}
}
}
这使得结果更加正常,随着时间的推移逐渐增加,而不是像之前那样无关紧要