Это гонка за данными? OPENMP - PullRequest
0 голосов
/ 17 июня 2020

Я немного запутался, если есть гонка данных для переменной k. Насколько я понимаю, только один поток будет выполнять единственную конструкцию, но, поскольку заявлено no wait, потоки немедленно начнут выполнение конструкции for. Достаточно ли здесь atomic, чтобы предотвратить любую потенциальную гонку данных?

#include <stdio.h>
#include <omp.h>
#define Nthreads 8

void main()
{

int n =9, l,k =n,i,j;
k += n+1;

omp_set_num_threads(Nthreads);

  #pragma omp parallel default(none) shared(n, k) private(j)
  {
   #pragma omp single nowait
    {
    k = k+5;
    }
   #pragma omp for nowait
     for( i =0; i< n; i++)
     {
      #pragma omp atomic
       k +=n+i+1;
     }
  }   
}

1 Ответ

1 голос
/ 19 июня 2020

Предполагая, что остальная часть кода правильно выражает ваш предполагаемый алгоритм, это почти так. Как вы, вероятно, подозревали, вам также необходимо защитить обновление k в одном регионе.

j - неиспользуемая переменная, я не знаю, просто вы забыли ее удалить или пытались реализовать sth else.

Я бы использовал предложение сокращения для k в for l oop вместо использования конструкции синхронизации. Хотя не знаю, было бы лучше или быстрее.

...