如何使用 OMP_SCHEDULE 环境变量覆盖 OpenMp 运行时调度策略?
How to override the OpenMp runtime scheduling policy using OMP_SCHEDULE environment variable?
我有一个 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 中指定的任何策略,这是否正确?谢谢
要获得您想要的内容,您可能需要进行一些手动干预。在初始化期间,我会在这个一般顺序上添加一些代码:
#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);
然后对于你的循环,在 #pragma
中指定 schedule(runtime)
调度策略,这样它将使用由 OMP_SCHEDULE
环境变量或我们上面设置的内容:
#pragma omp for schedule(runtime)
for(std::size_t i = 0 ; i < myArray.size() ; i++)
{
//some code here
}
为块大小传递 -1 告诉运行时 select 其默认值。根据情况,显式设置不同的值可能会提高性能(但 -1 应该等同于不指定块大小,就像您在 #pragma
中所做的那样)。
我有一个 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 中指定的任何策略,这是否正确?谢谢
要获得您想要的内容,您可能需要进行一些手动干预。在初始化期间,我会在这个一般顺序上添加一些代码:
#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);
然后对于你的循环,在 #pragma
中指定 schedule(runtime)
调度策略,这样它将使用由 OMP_SCHEDULE
环境变量或我们上面设置的内容:
#pragma omp for schedule(runtime)
for(std::size_t i = 0 ; i < myArray.size() ; i++)
{
//some code here
}
为块大小传递 -1 告诉运行时 select 其默认值。根据情况,显式设置不同的值可能会提高性能(但 -1 应该等同于不指定块大小,就像您在 #pragma
中所做的那样)。