Как предотвратить переключение потоков в цикле FOR при использовании директивы omp - PullRequest
0 голосов
/ 07 октября 2019

Допустим, такой простой цикл FOR

#pragma omp parallel for
 for (int i = 0; i<10; i++)
 {
    //do_something_1
    //do_something_2
    //do_something_3
 }

Как я понимаю, итерации цикла могут выполняться в любом порядке. Это хорошо для меня. Проблема в том, что потоки могут переключаться между собой во время выполнения итерации. Предположим там, где создано 10 потоков (как количество итераций). Допустим, в данный момент выполняется thread_1, и после завершения строк do_something_1 и do_something_2 он переключился на thread_4 (например). Есть ли способ заставить поток завершить всю итерацию без переключения, я имею в виду thread_1 завершение строк do_something_1, do_something_2 и do_something_3 без прерывания. Я понимаю, что это часть алгоритма ОС для многопоточной среды, но есть надежда, что есть способ обойти это.

Редактировать:

Использование предложения ORDERED в прагме необходимо только в 2 случаях: 1) Вам нужен результат предыдущей итерации в текущей итерации. И чем это будет однопотоковая программа 2) Вам нужно, чтобы ваш индекс был правильным на каждой итерации (хотя вы все еще можете выполнять все итерации параллельно).

Давайте посмотрим пример для моей задачи:

 int new_index = 0;

 #pragma omp parallel for
 for (int i = 0; i<10; i++)
 {
    <mutex lock>          
    new_index++  
    <mutex unlock>


    //do_something_1
    //do_something_2
    //do_something_3
    my_array[new_index] = 5; //correct
    my_array[i] = 5; //not correct
 }

Итак, будет еще 10 итераций, но теперь это должен быть правильный индекс каждый раз для my_array. Проблема в том, что thread_1 увеличивает new_index (new_index = 1), завершает do_something_1, а затем переключается на thread_2. Thread_2 полностью завершает свой цикл (new_index = 2), но теперь, когда ОС переключается обратно на thread_1, правильного new_index (new_index = 1) нет, и my_array остается неизменным. Итак, я подумал, что если есть возможность подключиться к ОС, не переключайте потоки в середине итерации.

...