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

Погледнахте ли клаузата на графика за паралела за?

#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