C pragma omp并行

时间:2016-11-22 20:28:47

标签: c parallel-processing openmp

我刚刚开始使用OpenMP,我需要帮助。

我有一个程序,我需要并行化它。这就是我所拥有的:

#include <stdio.h>
#include <sys/time.h>
#include <omp.h>

#define N1 3000000      
#define it 5

struct timeval  t0, t1;

int i, itera_kop;

int A[N1], B[N1];

void Exe_Denbora(char * pTestu, struct timeval *pt0, struct timeval *pt1)
{
  double tej;

  tej = (pt1->tv_sec - pt0->tv_sec) + (pt1->tv_usec - pt0->tv_usec) / 1e6;
  printf("%s = %10.3f ms (%d hari)\n",pTestu, tej*1000, omp_get_max_threads());
}

void sum(char * pTestu, int *b, int n)
{
  double bat=0;
  int i;

  for (i=0; i<n; i++) bat+=b[i];
  printf ("sum: %.1f\n",bat);
}

main ()  
{
  for (itera_kop=1;itera_kop<it;itera_kop++)
  {
    for(i=0; i<N1; i++)
    {
     A[i] = 1;
     B[i] = 3;
    }
    gettimeofday(&t0, 0);
    #pragma omp parallel for private(i)
    for(i=2; i<N1; i++)
    { 
      A[i] = 35 / (7/B[i-1] + 2/A[i]);
      B[i] = B[i] / (A[i-1]+2) + 3 / B[i];
    }
    gettimeofday(&t1, 0);
    Exe_Denbora("T1",&t0,&t1);
    printf ("\n");
  } 

  printf("\n\n");
  sum("A",A,N1);
  sum("B",B,N1);

}

如果我执行代码而不使用#pragma omp parallel for my get:

A sum: 9000005.5

B sum: 3000005.5

但如果我尝试并行化代码,我会得到:

A sum: 9000284.0

B sum: 3000036.0

使用32个线程。

我想知道为什么我无法将代码并行化

1 个答案:

答案 0 :(得分:0)

正如您可能意识到的那样,您的问题出现在此for循环中。循环中的两行之间存在依赖关系。

for(i=2; i<N1; i++)
{ 
  A[i] = 35 / (7/B[i-1] + 2/A[i]);
  B[i] = B[i] / (A[i-1]+2) + 3 / B[i];
}

我们无法知道任何给定线程到达这两行之一的顺序。因此,作为示例,当第二行执行时,B [i]中的值将根据A [i-1]是否已经被另一个线程改变而不同。 A [i]对B [i-1]的依赖性也是如此。可以在以下链接中找到关于依赖关系的简短明确说明。我建议你看看这还不清楚。 https://scs.senecac.on.ca/~gpu621/pages/content/omp_2.html