0

我是 OPENMP 游戏的新手,所以我目前正在使用比赛检测工具来测试我的技能。我使用 OPENMP 部分编写了以下代码:

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

#define N        10000
#define Nthreads 2
int randy = 1; 
double sum = 0.0;

void function1()
{
   int i, length =8; 
   printf("function1 thread id: %d", omp_get_thread_num());
   for (i=0;i<length;i++) {
     randy =i;
    }   
}

void function2()
{
   int i;  
   for(i=0; i< 5; i++)
   {
    sum +=i;
    }
   printf("function2 thread id: %d", omp_get_thread_num());
}

int main()
{  
  int numthreads, flag = 0, flg_tmp;
  omp_set_num_threads(Nthreads);
    #pragma omp parallel
    {
     #pragma omp sections
     {
        #pragma omp section
        {
           function2();
        }
        #pragma omp section
        {
           function1();
        }
      }
  }   
}

我收到变量 sum 和 randy 的数据竞争错误。它们是全局变量。我真的不明白为什么它将它们检测为比赛错误。但是,当我在函数内部而不是全局声明它们时,不会出现竞争错误。有人可以解释为什么吗?

工具声明:

==== 发现之间的比赛: 共享变量:

     17|double sum = 0.0;
Thread 1:

 33|   for(i=0; i< 5; i++)
 34|   {
> 35|    sum +=i;
 36|    }
 37|   printf("function2 thread id: %d", omp_get_thread_num());

Thread 2:

 33|   for(i=0; i< 5; i++)
 34|   {
>  35|    sum +=i;
 36|    }
 37|   printf("function2 thread id: %d", omp_get_thread_num());


==== Found a race between: 


  6|int randy = 1; 
    Thread 1:
     23|   printf("function1 thread id: %d", omp_get_thread_num());
     24|   for (i=0;i<length;i++) {
 >   25|     randy =i;
     26|    }   
     27|}
    Thread 2:
     23|   printf("function1 thread id: %d", omp_get_thread_num());
     24|   for (i=0;i<length;i++) {
>    25|     randy =i;
     26|    }   
     27|}
4

0 回答 0