我是 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|}