我正在运行哪个OpenMP调度?

3

如何在运行时检查OpenMP的调度方式?

我使用并行循环和运行时调度编译我的代码。

#pragma omp parallel for schedule(runtime) collapse(2)
for(j=1;j>-2;j-=2){
    for(i=0;i<n;i++){
    //nested loop code here
    }
}

我指定了环境变量OMP_SCHEDULE=dynamic,50

如何在运行时检查我的程序是否实际使用了OMP_SCHEDULE变量?

我正在使用带有gcc 4.7.3的openmp 3.1。


有没有一个OpenMP API函数,在程序运行时输出所有的运行时信息?我找不到它。 - undefined
1
void omp_get_schedule(omp_sched_t *kind, int *chunk_size) - undefined
1
@Z Boson,把它作为一个答案,并指向标准!(我刚开始写这个答案,但不想抢你的风头 :-)) - undefined
1个回答

9
我下载了http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf
然后进入“C/C++存根例程”部分,找到了这个。
void omp_get_schedule(omp_sched_t *kind, int *chunk_size)
{
*kind = omp_sched_static;
*chunk_size = 0;
}

然后进行了这个测试。
/*                                                                                                                                                                            
  typedef enum omp_sched_t {                                                                                                                                                  
    omp_sched_static = 1,                                                                                                                                                     
    omp_sched_dynamic = 2,                                                                                                                                                    
    omp_sched_guided = 3,                                                                                                                                                     
    omp_sched_auto = 4                                                                                                                                                        
  } omp_sched_t;                                                                                                                                                              
*/

#include <omp.h>
#include <stdio.h>
int main(void) {
  omp_sched_t kind;
  int chunk;
  omp_get_schedule(&kind, &chunk);
  printf("%d %d\n", kind, chunk);
}

和编译

gcc -fopenmp -O3 foo.c

然后

export OMP_SCHEDULE=static,50
./a.out
1 50
export OMP_SCHEDULE=dynamic,100
2 100

请注意,omp_get_schedule 仅报告运行时调度定义 OMP_SCHEDULE。如果您使用其他方式更改了调度,则需要使用其他方法来检索新的调度信息。
#pragma omp parallel for schedule(static,1)

如果定义了OMP_SCHEDULE=dynamic,100,那么omp_get_schedule仍会报告动态调度和块大小为100。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接