Я новичок в игре 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|}