Задачи OpenMP - способ запретить конкретному потоку выполнять задачи?

Я создаю несколько задач в OpenMP, но почему-то задачи выполняются одним потоком. Код имеет следующий шаблон:

#pragma omp parallel num_threads(n_threads)

#pragma omp single 
while(!found){

            /.... operations with k, e, y, dist, u, step

            #pragma omp task firstprivate(k, e, y, dist, u, step)
            process(k, e, y, dist, u, step, h, out);

}

Есть ли способ заставить систему времени выполнения OpenMP назначать задачи всем потокам, кроме того, который создает задачу?

Спасибо

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

void process(int a[]){
    printf("Thread %d processing\n", omp_get_thread_num());
    /* Heavy Operations (used sleep to simulate them)*/
    sleep(10);
}

int main(){
    int a[10];
    int i, j;
    #pragma omp parallel num_threads(4)
    {
        #pragma omp single
        {
            for (j = 0; j < 10; j++) {
                /* Compute a */
                for (i = 0; i < 10; i++) {
                    a[i] += 1;
                }
                #pragma omp task firstprivate(a)
                process(a);
            }
            printf("Thread %d finished preprocessing\n", omp_get_thread_num());
        }
    }
}

Выход:

Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 finished preprocessing

person fc67    schedule 14.04.2014    source источник


Ответы (1)


Разве это не тот же вопрос, что и в другом вашем сообщении (Точки планирования задач для задач OpenMP)

Ответ на этот вопрос здесь: нет, вы не можете контролировать, как реализация OpenMP назначает задачи потокам OpenMP параллельной группы.

Могу я предложить вам опубликовать фрагмент кода, который действительно компилируется? Тогда было бы проще проверить, почему код ведет себя не так, как вы думаете.

С примером кода, добавленным OP, вот поведение на моей машине:

$> gcc -fopenmp omp.c
$> ./a.out
Thread 0 finished preprocessing
Thread 0 processing
Thread 3 processing
Thread 2 processing
Thread 1 processing
Thread 0 processing
Thread 3 processing
Thread 2 processing
Thread 1 processing
Thread 0 processing
Thread 3 processing
$> gcc --version
gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012]
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$> icc -openmp omp.c
$> ./a.out
Thread 0 finished preprocessing
Thread 0 processing
Thread 3 processing
Thread 2 processing
Thread 1 processing
Thread 0 processing
Thread 3 processing
Thread 2 processing
Thread 1 processing
Thread 0 processing
Thread 3 processing
mklemm-mobl2-vm:~/tmp [0]> icc -V
Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.1.106 Build 20131008
Copyright (C) 1985-2013 Intel Corporation.  All rights reserved.

Какой компилятор вы используете?

Ура, Майкл

person Michael Klemm    schedule 14.04.2014
comment
Это не совсем тот же вопрос. Я добавил простую версию кода, который использую, и ее вывод. Он должен скомпилироваться без проблем. Как вы можете видеть, поток 1 выполняет каждую задачу и выходит из цикла только после того, как все задачи были вычислены. - person fc67; 14.04.2014
comment
Я использую gcc 4.8.2. И я компилирую его так: gcc -fopenmp -O2 test.c -o test.o. - person fc67; 14.04.2014