Детектор гонки данных - OPENMP - PullRequest
0 голосов
/ 16 июня 2020

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