矩阵乘法OpenMP计数器直观结果



我目前正在工作地点将一些代码移植到OpenMP。我正在做的任务之一是找出如何为我们的一个应用程序加速矩阵乘法。

矩阵以行主格式存储,因此A[i*cols+j]给出矩阵A的A_i_j元素。

代码如下(取消注释杂注会使代码并行(:

#include <omp.h>
#include <iostream>
#include <iomanip>
#include <stdio.h>
#define NUM_THREADS 8
#define size 500
#define num_iter 10
int main (int argc, char *argv[])
{
//    omp_set_num_threads(NUM_THREADS);
int *A = new int [size*size];
int *B = new int [size*size];
int *C = new int [size*size];
for (int i=0; i<size; i++)
{
for (int j=0; j<size; j++)
{
A[i*size+j] = j*1;
B[i*size+j] = i*j+2;
C[i*size+j] = 0;
}
}
double total_time = 0;
double start = 0;
for (int t=0; t<num_iter; t++)
{
start = omp_get_wtime();
int i, k;
//        #pragma omp parallel for  num_threads(10) private(i, k) collapse(2) schedule(dynamic)
for (int j=0; j<size; j++)
{
for (i=0; i<size; i++)
{
for (k=0; k<size; k++)
{
C[i*size+j] += A[i*size+k] * B[k*size+j];
}
}
}
total_time += omp_get_wtime() - start;
}
std::setprecision(5);
std::cout << total_time/num_iter << std::endl;
delete[] A;
delete[] B;
delete[] C;
return 0;
}

让我困惑的是:为什么动态调度比静态调度更快?计时运行并取平均值表明静态调度较慢,这对我来说有点违反直觉,因为每个线程都在做相同数量的工作。

另外,我是否正确地加速了我的矩阵乘法代码?

并行矩阵乘法是不平凡的(你考虑过缓存阻塞吗?(。你最好的选择可能是使用BLAS库,而不是自己写。(记住,"最好的代码是我不必编写的代码"(。

维基百科:基本线性代数子程序指向许多实现,其中许多(包括英特尔数学内核库(都有免费许可证。

最新更新