为什么在 OMP_SCHEDULE=static 时 omp_get_schedule() return 是一个单调的时间表?

why does omp_get_schedule() return a monotonic schedule when OMP_SCHEDULE=static?

我在 redhat8 上用 g++8.5 编译我的代码,我注意到当我设置 OMP_SCHEDULE=static 时,然后在我的应用程序中 omp_get_schedule() returns 一个“单调的”时间表而不是“静态”的时间表。为什么会这样?如果我将 OMP_SCHEDULE 设置为其他内容,例如“动态”,那么我的应用程序会将其识别为“动态”。这是有问题的代码。有任何想法吗?谢谢

             omp_sched_t kind;                 
             int chunk_size;
             omp_get_schedule(&kind, &chunk_size);
             
             switch(kind)
             {
               case omp_sched_static:
               {
                 schedule_msg = schedule_msg + "schedule=static, chunk_size="+std::to_string(chunk_size);
                 break;
               }
               case omp_sched_dynamic:
               {                     
                 schedule_msg = schedule_msg + "schedule=dynamic, chunk_size="+std::to_string(chunk_size);
                 break;
               }
               case omp_sched_guided:
               {
                 schedule_msg = schedule_msg + "schedule=guided, chunk_size="+std::to_string(chunk_size);                     
                 break;
               }
               case omp_sched_auto:
               {
                 schedule_msg = schedule_msg + "schedule=auto, chunk_size="+std::to_string(chunk_size);                     
                 break;
               }
               default:
               {
                 schedule_msg = schedule_msg + "schedule=monotonic, chunk_size="+std::to_string(chunk_size); 
                 break;
               }
             }   

omp_sched_tdefined 为:

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

注意omp_sched_monotonic是修饰符而不是类型,所以monotonic:static表示为omp_sched_monotonic | omp_sched_static(其值为0x80000001).

根据 OpenMP 标准:

If the static schedule kind is specified or if the ordered clause is specified, and if no monotonic modifier is specified, the effect will be as if the monotonic modifier was specified.

因此,如果 OMP_SCHEDULE 设置为 static,则 omp_get_schedule() 的 return 值为 0x80000001,但您的代码未正确处理单调修饰符。