параллельная программа в c с использованием openmp работает некорректно - PullRequest
0 голосов
/ 27 апреля 2020

когда я запускаю этот код в блоках кода, он выдает странный вывод

#include<omp.h>
#include<stdio.h>
int main (int argc, char* argv[])
 {

int id, var2=2, var3 =3;

/* sequential code */
printf("I am a serial region. \n");

#pragma omp parallel private(var2) shared(var3)
{
    id = omp_get_thread_num();
    if(id == 0){
        var2 = 22;
    }
    printf ("hello from thread %d\n" , id);
    printf("var2 %d \n " , var2);
    printf("var3 %d \n " , var3);
}

/* sequential code */
printf("I am a serial region. \n");
}

, так почему вывод не организован?

output

1 Ответ

0 голосов
/ 28 апреля 2020

Я предполагаю, что вы говорите о путанице, а не о вещах не по порядку. Вы не можете ожидать параллельной печати в любом порядке. Это просто природа параллельной работы.

Если вы имеете в виду линию, которая идет hello from threadhello from thread 1 и странный v 0, то вы, вероятно, имеете дело с гонкой данных . Любая переменная вне рабочей области по умолчанию является общей. Вы явно не объявили id как частный или общий, поэтому он автоматически распределяется между потоками. Вы можете одновременно получать доступ и записывать значение id между потоками. В любое время, когда у вас есть гонка данных, поведение не определено, поэтому вы можете увидеть все виды странных вещей. Чтобы исправить это, вам нужно будет указать его как приватное или просто объявить идентификатор в for l oop.

...