C++ C++;并行矩阵乘法

C++ C++;并行矩阵乘法,c++,openmp,C++,Openmp,我的openMP代码有什么问题?它总是只需要1个线程,并且与非并行版本同时工作 template <typename T> Matrix<T>* Matrix<T>::OMPMultiplication(Matrix<T>* A, Matrix<T>* B){ if(A->ySize != B->xSize) throw; Matrix<T>* C = new Matrix<

我的openMP代码有什么问题?它总是只需要1个线程,并且与非并行版本同时工作

template <typename T>
Matrix<T>* Matrix<T>::OMPMultiplication(Matrix<T>* A, Matrix<T>* B){ 

    if(A->ySize != B->xSize)
      throw;

    Matrix<T>* C = new Matrix<T>(A->xSize, B->ySize);

    sizeType i, j, k;
    T element;

    #pragma omp parallel for private(i, j)
    {
      #pragma omp for private(i, j)
      for( i = 0; i < A->xSize; i++ )
          cout<<"There are "<<omp_get_num_threads()<<" threads"<<endl;

          for(j = 0; j < B->ySize; j++){

              C->matrix[i][j] = 0;
              for(k = 0; k < A->ySize; k++){
                  C->matrix[i][j] += A->matrix[i][k] * B->matrix[k][j]; 
              }   

      }   
    }   
    return C;
}
模板
矩阵*矩阵::乘法(矩阵*A,矩阵*B){
如果(A->ySize!=B->xSize)
投掷;
矩阵*C=新矩阵(A->xSize,B->ySize);
尺寸类型i,j,k;
T元素;
#pragma omp并行专用(i,j)
{
#pragma omp用于私人(i,j)
对于(i=0;ixSize;i++)

首先,您缺少一些
{}
对于
i
循环和变量
k
需要对
i
循环的每次迭代进行私有化。但是,我认为您还混淆了
并行
for
杂注的组合方式。要成功地并行化for循环,需要将其放入
并行
杂注中然后在
pragma的
中。要做到这一点,您可以将代码更改为

#pragma omp parallel private(i, j, k)
{
    #pragma omp for
    for( i = 0; i < A->xSize; i++ ) {
        cout<<"There are "<<omp_get_num_threads()<<" threads"<<endl;

        for(j = 0; j < B->ySize; j++) {

            C->matrix[i][j] = 0;
            for(k = 0; k < A->ySize; k++){
                C->matrix[i][j] += A->matrix[i][k] * B->matrix[k][j]; 
            }   

        }
    }
}
另外,请确保您告诉OpenMP在此处使用多个线程。这可以通过
omp\u set\u num\u threads()
和设置环境变量(如
omp\u num\u threads
来完成


希望您能将其并行化。

使用以下代码,我的4个内核的运行速度略快一些:

    omp_set_num_threads(4);
    #pragma omp parallel for
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            c[i] += b[j] * a[j][i];
        }
    }
omp\u set\u num\u线程(4);
#pragma-omp并行
对于(i=0;i
完整程序

#include <stdio.h>
#include <time.h>
#include <omp.h>
#include <stdlib.h>


int main() {
    int i, j, n, a[719][719], b[719], c[719];

    clock_t start = clock();

    n = 100; //Max 719

    printf("Matrix A\n");

    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            a[i][j] = 10;
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    printf("\nMatrix B\n");

#pragma omp parallel private(i) shared(b)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            b[i] = 5;
            printf("%d\n", b[i]);
        }
    }

    printf("\nA * B\n");

#pragma omp parallel private(i) shared(c)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            c[i] = 0;
        }
    }

#pragma omp parallel private(i,j) shared(n,a,b,c)
    {
#pragma omp for schedule(dynamic)
        for (i = 0; i < n; ++i) {
            for (j = 0; j < n; ++j) {
                c[i] += b[j] * a[j][i];
            }
        }
    }


#pragma omp parallel private(i) shared(c)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            printf("%d\n", c[i]);
        }
    }

    clock_t stop = clock();
    double elapsed = (double) (stop - start) / CLOCKS_PER_SEC;
    printf("\nTime elapsed: %.5f\n", elapsed);
    start = clock();
    printf("Matrix A\n");

    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            a[i][j] = 10;
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    printf("\nMatrix B\n");

#pragma omp parallel private(i) shared(b)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            b[i] = 5;
            printf("%d\n", b[i]);
        }
    }
    printf("\nA * B\n");
    omp_set_num_threads(4);
#pragma omp parallel for
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            c[i] += b[j] * a[j][i];
        }
    }
    stop = clock();
    elapsed = (double) (stop - start) / CLOCKS_PER_SEC;
    printf("\nTime elapsed: %.5f\n", elapsed);
    return 0;
}
#包括
#包括
#包括
#包括
int main(){
inti,j,n,a[719][719],b[719],c[719];
时钟启动=时钟();
n=100;//最大值719
printf(“矩阵A\n”);
对于(i=0;i
第一种方法需要

所用时间:0.03442

第二种方法

所用时间:0.02630


第一个pragma包含“for”,但它不是
for
pragma(这是第二个)。@victors并且
#pragma omp parallel
#pragma omp for
的组合不是嵌套并行。
#include <stdio.h>
#include <time.h>
#include <omp.h>
#include <stdlib.h>


int main() {
    int i, j, n, a[719][719], b[719], c[719];

    clock_t start = clock();

    n = 100; //Max 719

    printf("Matrix A\n");

    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            a[i][j] = 10;
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    printf("\nMatrix B\n");

#pragma omp parallel private(i) shared(b)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            b[i] = 5;
            printf("%d\n", b[i]);
        }
    }

    printf("\nA * B\n");

#pragma omp parallel private(i) shared(c)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            c[i] = 0;
        }
    }

#pragma omp parallel private(i,j) shared(n,a,b,c)
    {
#pragma omp for schedule(dynamic)
        for (i = 0; i < n; ++i) {
            for (j = 0; j < n; ++j) {
                c[i] += b[j] * a[j][i];
            }
        }
    }


#pragma omp parallel private(i) shared(c)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            printf("%d\n", c[i]);
        }
    }

    clock_t stop = clock();
    double elapsed = (double) (stop - start) / CLOCKS_PER_SEC;
    printf("\nTime elapsed: %.5f\n", elapsed);
    start = clock();
    printf("Matrix A\n");

    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            a[i][j] = 10;
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    printf("\nMatrix B\n");

#pragma omp parallel private(i) shared(b)
    {
#pragma omp for
        for (i = 0; i < n; ++i) {
            b[i] = 5;
            printf("%d\n", b[i]);
        }
    }
    printf("\nA * B\n");
    omp_set_num_threads(4);
#pragma omp parallel for
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            c[i] += b[j] * a[j][i];
        }
    }
    stop = clock();
    elapsed = (double) (stop - start) / CLOCKS_PER_SEC;
    printf("\nTime elapsed: %.5f\n", elapsed);
    return 0;
}