почему один omp-поток завершает работу, а другой не может сделать то же самое?

0

Я пытаюсь выполнить следующий код и ожидаю, что 1-й цикл цикла будет разделен между 2 потоками, который отлично работает,

цикл 2-го цикла должен выполняться в "полноте" 2 раза, т.е. потоком 0, а также нить 1, которая не возникает, как показывает результат.

omp_set_num_threads(2);
#pragma omp parallel
{

#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);

printf("\n\n");

//if(omp_get_thread_num()==1) //if enalbled then prints all a->z letters
{

for(i=97;i<123;i++){
printf("%c %d",i,omp_get_thread_num());
#pragma omp flush
}

}
#pragma omp barrier
}

Запустить 1

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1m 1n 1o 1p 1q 1r 1s 1t 1u 1v 1w 1x 1y 1z 1

a 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o 0p 0q 0r 0s 0t 0u 0v 0w 0x 0y 0z 0

Запуск 2

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

a 0b 0c 0d 0e 0f 0g 0

a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1h 0n 0o 0p 0q 0r 0s 0t 0u 0v 0w 0x 0y 0z 0m 1

так что может быть причиной того, что нить 1 не печатает все az? переключение может произойти, но, поскольку "скрытый" барьер существует в конце параллельной конструкции, так что поток 1 -thread0 должен был ждать, пока друг друга не закончат.

я пробовал 8-9 прогонов и заметил, что поток 1 всегда не может распечатать ожидаемый результат!

при включении условия if when1 успешно печатает az при каждом запуске (проверено 12 раз!)

  • 0
    Потому что у вас есть состояние гонки в i Сделайте это частным.
Теги:
multithreading
parallel-processing
openmp

1 ответ

0

это должно работать так, как вы хотите:

omp_set_num_threads (2);

#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);

printf("\n\n");

#pragma omp parallel private(i)
{

for(i=97;i<123;i++)
printf("%c %d",i,omp_get_thread_num());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню