gpt4 book ai didi

parallel-processing - num_threads与omp_set_num_threads与OMP_NUM_THREADS之间的差异

转载 作者:行者123 更新时间:2023-12-03 15:20:21 24 4
gpt4 key购买 nike

我对在代码的并行部分中指定线程数的方法感到很困惑。
我知道我可以使用:


环境变量OMP_NUM_THREADS
函数omp_set_num_threads(int)
#pragma omp parallel for num_threads(NB_OF_THREADS)中的num_threads(int)


到目前为止,我所收集的前两个是等效的。但是第三个呢?
有人可以提供更详细的差异说明吗,我在互联网上找不到有关1/2和3之间差异的任何信息。

最佳答案

OMP_NUM_THREADSomp_set_num_threads()不等效。环境变量仅用于设置nthreads-var ICV的初始值(内部控制变量),该变量控制组中最大线程数。 omp_set_num_threads()可用于随时更改nthreads-var的值(当然,在任何并行区域之外),并且会影响所有后续并行区域。因此设置一个值,例如nOMP_NUM_THREADS等效于在遇到第一个并行区域之前调用omp_set_num_threads(n)
Openaa网站上免费提供的OpenMP specification中非常清楚地描述了确定并行区域中线程数的算法:

如果num_threads子句存在
然后让ThreadsRequested为num_threads子句表达式的值;
否则,让ThreadsRequested = nthreads-var的第一个元素的值;

规范的“ ICV替代关系”部分列出了设置nthreads-var的不同方法的优先级:

num_threads子句和omp_set_num_threads()覆盖OMP_NUM_THREADS环境变量的值和nthreads-var ICV的第一个元素的初始值。

翻译成人类语言,即:

OMP_NUM_THREADS(如果存在)最初指定线程数;
调用omp_set_num_threads()会覆盖OMP_NUM_THREADS的值;
num_threads子句的存在会覆盖其他两个值。

实际使用的线程数还受到是否启用动态组大小(通过OMP_DYNAMIC和/或omp_set_dynamic()设置dyn-var ICV),是否通过thread-limit-var施加线程限制(通过OMP_THREAD_LIMIT),以及是否启用嵌套并行性(OMP_NESTED / omp_set_nested())。

关于parallel-processing - num_threads与omp_set_num_threads与OMP_NUM_THREADS之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22813923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com