OpenMP - для назначения потока цикла

Предположим, у меня есть массив с индексами 0..n-1. Есть ли способ выбрать, какие ячейки будет обрабатывать каждый поток? например поток 0 будет обрабатывать ячейки 0 и 5, поток 1 будет обрабатывать ячейки 1 и 6 и так далее.


person Shmoopy    schedule 01.12.2012    source источник
comment
два вопроса: зачем тебе это? что ты пробовал?   -  person stefan    schedule 02.12.2012
comment
Вложенные циклы, for(off = 0; off < 5; ++off) { for(i = off; i < size; i += 5) { ... }}? (Предполагая, что у вас есть опечатка и средний поток 1 обрабатывает 1, 6 и т. д.)   -  person Daniel Fischer    schedule 02.12.2012
comment
@stefan Поскольку для ячеек 0 и 5 на следующей итерации требуются ячейки 0 и 5 на текущей итерации (то же самое для 1,6 2,7 и т. д.), таким образом, я хочу назначить каждому потоку пару ячеек   -  person Shmoopy    schedule 02.12.2012
comment
@DanielFischer Я не могу использовать это, так как n неизвестно во время компиляции. Я ищу что-то динамическое   -  person Shmoopy    schedule 02.12.2012
comment
Обратите внимание, что такое назначение элементов массива потокам часто приводит к большому количеству ложного совместного использования, и параллельный код может работать не так быстро, как можно было бы ожидать.   -  person Hristo Iliev    schedule 02.12.2012


Ответы (2)


Можно даже более явно:

#pragma omp parallel
{
   int nth = omp_get_num_threads();
   int ith = omp_get_thread_num();
   for (int i=ith; i<n; i+=nth)
   {
      // handle cell i.
   }
}

это должно делать именно то, что вы хотите: поток ith обрабатывает ячейку ith, ith+nth, ith+2*nth, ith+3*nth и так далее.

person nat chouf    schedule 02.12.2012
comment
Спасибо, это то, что я искал. - person Shmoopy; 03.12.2012

Вы смотрели пункт расписания для параллельного for?

#pragma omp for schedule(static, 1)

должен реализовать то, что вы хотите, вы можете поэкспериментировать с предложением расписания, используя следующий простой код:

#include<stdio.h>
#include<omp.h>

int main(){

  int i,th_id;

  #pragma omp parallel for schedule(static,1)
  for ( i = 0 ; i < 10 ; ++i){
    th_id = omp_get_thread_num();
    printf("Thread %d is on %d\n",th_id,i);
  }

}
person igon    schedule 01.12.2012