Matrix 矩阵乘法OpenMP反直观结果

Matrix 矩阵乘法OpenMP反直观结果,matrix,openmp,Matrix,Openmp,我目前正在工作地点将一些代码移植到OpenMP。我正在做的任务之一是找出如何为我们的一个应用程序加速矩阵乘法 矩阵以行主格式存储,因此[i*cols+j]给出矩阵A的A_i_j元素 代码如下所示(取消对pragma的注释会使代码并行): #包括 #包括 #包括 #包括 #定义NUM_线程8 #定义尺寸500 #定义数字10 int main(int argc,char*argv[]) { //omp_设置_num_线程(num_线程); int*A=新的int[size*size]; int*B

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

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

代码如下所示(取消对pragma的注释会使代码并行):

#包括
#包括
#包括
#包括
#定义NUM_线程8
#定义尺寸500
#定义数字10
int main(int argc,char*argv[])
{
//omp_设置_num_线程(num_线程);
int*A=新的int[size*size];
int*B=新的int[size*size];
int*C=新的int[size*size];

对于(int i=0;i并行矩阵乘法非常重要(您考虑过缓存阻塞吗?)。您最好使用BLAS库,而不是自己编写。(请记住,“最好的代码是我不必编写的代码”)

指向许多实现,其中很多(包括英特尔数学内核库)都有免费许可证

#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;
}