并行处理-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 processingn", 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 preprocessingn", 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

这不是和你其他帖子中的问题一样吗(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.

你在用什么编译器?

干杯,-michael

最新更新