简体   繁体   English

乘法矩阵openMP比顺序慢

[英]Multiplying matrix openMP is slower than sequential

I am new to C and have created a program that creates two arrays and then multiplies them using openMP.我是 C 的新手,我创建了一个程序来创建两个 arrays,然后使用 openMP 将它们相乘。 When I compare them the sequential is quicker than the openMP way.当我比较它们时,顺序比 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;
}

The sequential way takes 0.265000 while the openMP takes 0.563000.顺序方式需要 0.265000,而 openMP 需要 0.563000。 I have no idea why, any solutions?我不知道为什么,有什么解决办法吗?

Updated code to global arrays and make them larger but still takes double the run time.将代码更新为全局 arrays 并使它们更大,但仍需要双倍的运行时间。

OpenMP needs to create and destroy threads, which results in extra overhead. OpenMP 需要创建和销毁线程,这会导致额外的开销。 Such overhead is quite small, but for a very small workload, like yours, it can still be significant.这样的开销非常小,但是对于像您这样的非常小的工作负载,它仍然很重要。

to use OpenMP more efficiently, you should give it a large workload (larger matrices) and make thread-related overhead not the dominant factor in your runtime.为了更有效地使用 OpenMP,您应该给它一个较大的工作负载(更大的矩阵),并使与线程相关的开销不是您运行时的主要因素。

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

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