如何使用 OMP_SCHEDULE 环境变量覆盖 OpenMp 运行时调度策略?

问题描述

我有一个 openMP 并行 for 循环形式

#pragma omp for schedule(dynamic)
for(std::size_t i = 0 ; i < myArray.size() ; i++)
{
  //some code here
}

换句话说,这个循环认使用动态调度。但是,如果用户指定 OMP_SCHEDULE 环境变量,我希望能够使用 OMP_SCHEDULE 中指定的任何策略覆盖动态策略。如何才能做到这一点?换句话说,如果未指定 OMP_SCHEDULE,我想认使用动态计划。我的理解是在上面的代码中,因为我指定了 schedule(dynamic) 它将忽略 OMP_SCHEDULE 中指定的任何策略,这是正确的吗?谢谢

解决方法

要获得您想要的东西,您可能需要进行一些人工干预。在初始化期间,我会按照这个一般顺序添加一些代码:

function SearchingChallenge(str) {
  let onlyLetters = /^[a-zA-Z]+$/;
  if (str.length > 4 && str.length < 25) {
    if (onlyLetters.test(str.charAt(0))) {
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}
console.log(SearchingChallenge('Hello World!'));
console.log(SearchingChallenge('!dlroW olleH'));
console.log(SearchingChallenge('u__adced_123'));

然后对于您的循环,在 #include <omp.h> std::string scheduling = getenv("OMP_SCHEDULE"); // If the user didn't specify anything,set the default we want. if (scheduling.empty()) omp_set_schedule(omp_sched_dynamic,-1); 中指定 schedule(runtime) 调度策略,因此它将使用由 #pragma 环境变量或我们上面设置的内容:

OMP_SCHEDULE

为块大小传递 -1 会告诉运行时选择其默认值。根据情况,显式设置不同的值可能会提高性能(但 -1 应该相当于不指定块大小,就像您在 #pragma omp for schedule(runtime) for(std::size_t i = 0 ; i < myArray.size() ; i++) { //some code here } 中所做的那样)。