如何动态选择调度类型?

时间:2016-05-18 00:56:55

标签: c openmp schedule pragma

我需要使用openMP比较不同调度类型和线程号的循环执行时间。

我可以通过直接在pragma宏中传递int变量来动态设置线程数:

int threads_number = 4;
#pragma omp parallel for num_threads(threads_number)

但我正在尝试对schedule执行相同操作,我需要比较staticdynamicguided类型。但似乎我不能使用int作为枚举,也不能使用char*作为此名称。

有没有办法动态选择它,或者我是否必须编写循环3次并选择使用if调用哪一个,这看起来有点脏?

1 个答案:

答案 0 :(得分:3)

您可以在应用的时间表为runtime时设置时间安排类型。

  

当指定调度(运行时)时,有关调度的决定将推迟到运行时。通过设置环境变量OMP_SCHEDULE,可以在运行时选择块的调度类型和大小。如果未设置此环境变量,则生成的计划是实现定义的。指定schedule(运行时)时,不能指定chunk_size。 - OpenMP-4.5 Specification

这是通过函数void omp_set_schedule(omp_sched_t kind, int chunk_size);

完成的

可用的计划种类在omp.h中定义,如下面的枚举

typedef enum omp_sched_t {
    omp_sched_static = 1,
    omp_sched_dynamic = 2,
    omp_sched_guided = 3,
    omp_sched_auto = 4
} omp_sched_t;