Я пытаюсь выполнить следующий код и ожидаю, что 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
}
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
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
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
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 раз!)
это должно работать так, как вы хотите:
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());
}
i
Сделайте это частным.