我在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