Предположим, у меня есть массив с индексами 0..n-1. Есть ли способ выбрать, какие ячейки будет обрабатывать каждый поток? например поток 0 будет обрабатывать ячейки 0 и 5, поток 1 будет обрабатывать ячейки 1 и 6 и так далее.
OpenMP - для назначения потока цикла
Ответы (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
Спасибо, это то, что я искал.
- 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
for(off = 0; off < 5; ++off) { for(i = off; i < size; i += 5) { ... }}
? (Предполагая, что у вас есть опечатка и средний поток 1 обрабатывает 1, 6 и т. д.) - person Daniel Fischer   schedule 02.12.2012