- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对在代码的并行部分中指定线程数的方法感到很困惑。
我知道我可以使用:
环境变量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_THREADS
和omp_set_num_threads()
不等效。环境变量仅用于设置nthreads-var ICV的初始值(内部控制变量),该变量控制组中最大线程数。 omp_set_num_threads()
可用于随时更改nthreads-var的值(当然,在任何并行区域之外),并且会影响所有后续并行区域。因此设置一个值,例如n
到OMP_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/
我在VS2008中有以下代码: int i,j; bool pr = false; #pragma omp parallel for private(pr) num_threads(2) for(i=
我试图在程序的不同部分使用不同数量的线程来实现最大加速。但是,发现使用 num_threads 子句切换线程数会产生大量开销。我正在寻找对此的解释,因为根据我的理解,线程池应该始终包含给定数量的线程,
#include #include #include void main(int argc, int *argv[]){ #pragma omp parallel num
在Is OpenMP (parallel for) in g++ 4.7 not very efficient? 2.5x at 5x CPU ,我确定当使用默认的 #pragma omp paral
下面几行代码 int nrows = 4096; int ncols = 4096; size_t numel = nrows * ncols; unsigned char *buff = (unsi
我在各种情况下运行过我的代码,这导致了我认为奇怪的行为。我的测试是在具有 HT 的双核英特尔至强处理器上进行的。 没有 OpenMP '#pragma' 语句,总运行时间 = 507 秒 使用指定 1
openmp 的新手。我的环境如下: ubuntu 16.04TLS gcc 7.3.0 我的代码如下: #include #include int main() { #pragma om
为什么我在使用“#pragma omp parallel num_threads(4)”时没有得到不同的线程 ID。在这种情况下,所有线程 ID 都是 0。但是当我评论该行并使用默认线程数时,我得到了
我是一名优秀的程序员,十分优秀!