繁体   English   中英

OpenMP性能影响:私有指令与构造内部声明变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM