[英]OpenMP Performance impact: private directive vs. declaring variable inside for construct
性能方面,以下哪项更有效?
在主线程中分配并将值复制到所有线程:
int i = 0;
#pragma omp parallel for firstprivate(i)
for( ; i < n; i++){
...
}
在每个线程中声明并分配变量
#pragma omp parallel for
for(int i = 0; i < n; i++){
...
}
在主线程中声明变量但在每个线程中分配它。
int i;
#pragma omp parallel for private(i)
for(i = 0; i < n; i++){
...
}
这似乎是一个愚蠢的问题和/或性能影响可以忽略不计。 但我正在并行化一个执行少量计算的循环,并且被称为很多次,所以我可以从这个循环中挤出的任何优化都是有帮助的。
我正在寻找更低级别的解释以及OpenMP如何处理这个问题。
例如,如果对大量线程进行并行化,我假设第二个实现会更有效,因为使用xor
初始化变量比将变量复制到所有线程要有效得多
在您提供的3个版本中,性能方面没有太大差异,因为每个版本都使用#pragma omp parallel for
。 因此,OpenMP会自动将每个迭代分配给不同的线程。 因此,变量i
将成为每个线程的私有,并且每个线程将具有不同的迭代范围以供使用。 变量'i'
自动设置为private,以便在更新此变量时避免竞争条件。 因为,无论如何变量'i'
在并行上都是私有的,所以不需要在#pragma omp parallel for
上放置private(i) 。
然而,您的第一个版本将产生错误,因为OpenMP期望#pragma omp parallel for
下面的循环具有以下格式:
for(init-expr; test-expr;incr-expr)
为了预先计算工作范围。
for指令对所有相关for循环的结构设置了限制。 具体来说,所有关联的for循环必须具有以下规范形式:
for(init-expr; test-expr; incr-expr)structured-block( OpenMP Application Program Interface pag.39 / 40。)
编辑 :我测试了你的两个最后版本,并检查了生成的程序集。 两个版本都生成相同的程序集,如您所见 - > 版本2和版本3 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.