繁体   English   中英

乘法矩阵openMP比顺序慢

[英]Multiplying matrix openMP is slower than sequential

我是 C 的新手,我创建了一个程序来创建两个 arrays,然后使用 openMP 将它们相乘。 当我比较它们时,顺序比 openMP 方式更快。

#include <stdio.h>
#include <stdio.h>
#include <omp.h>
#include <time.h>
#define SIZE 1000

int arrayOne[SIZE][SIZE];
int arrayTwo[SIZE][SIZE];
int arrayThree[SIZE][SIZE];

int main()
{
  int i=0, j=0, k=0, sum = 0;

  //creation of the first array
  for(i = 0; i < SIZE; i++){
    for(j = 0; j < SIZE; j++){
      arrayOne[i][j] = 2;
      /*printf("%d \t", arrayOne[i][j]);*/
    }
  }

  //creation of the second array
  for(i = 0; i < SIZE; i++){
    for(j = 0; j < SIZE; j++){
      arrayTwo[i][j] = 3;
      /*printf("%d \t", arrayTwo[i][j]);*/
    }
  }

  clock_t begin = clock();
  //Matrix Multiplication (No use of openMP)
  for (i = 0; i < SIZE; ++i) {
      for (j = 0; j < SIZE; ++j) {
          for (k = 0; k < SIZE; ++k) {
              sum = sum + arrayOne[i][k] * arrayTwo[k][j];
          }
          arrayThree[i][j] = sum;
          sum = 0;
      }
  }
  clock_t end = clock();
  double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  printf("Time taken without openMp: %f  \n", time_spent);

  //Matrix Multiplication Using openMP
  printf("---------------------\n");
  clock_t new_begin = clock();
  #pragma omp parallel private(i, j, sum, k) shared (arrayOne, arrayTwo, arrayThree)
  {
    #pragma omp for schedule(static)
    for (i = 0; i < SIZE; i++) {
      for(j = 0; j < SIZE; j++) {
        for(k = 0; k < SIZE; k++) {
            sum = sum + arrayOne[i][k] * arrayTwo[k][j];
          }
          arrayThree[i][j] = sum;
          sum = 0;
      }
    }
  }
  clock_t new_end = clock();
  double new_time_spent = (double)(new_end - new_begin) / CLOCKS_PER_SEC;
  printf("Time taken WITH openMp: %f  ", new_time_spent);

  return 0;
}

顺序方式需要 0.265000,而 openMP 需要 0.563000。 我不知道为什么,有什么解决办法吗?

将代码更新为全局 arrays 并使它们更大,但仍需要双倍的运行时间。

OpenMP 需要创建和销毁线程,这会导致额外的开销。 这样的开销非常小,但是对于像您这样的非常小的工作负载,它仍然很重要。

为了更有效地使用 OpenMP,您应该给它一个较大的工作负载(更大的矩阵),并使与线程相关的开销不是您运行时的主要因素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM