c++ - 编写 OpenMP 部分的方式之间有什么区别?
问题描述
使用之间有什么(如果有的话)区别:
#pragma omp parallel
{
#pragma omp for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
}
和:
#pragma omp parallel for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
还是编译器(ICC)在乎?
我知道第一个定义了一个并行部分,而不是一个要划分的 for 循环,并且您可以在循环之后执行多个操作。如果我错了,请纠正我,仍在学习openmp的方式..
但是你什么时候会使用其中一种方式呢?
解决方案
简而言之,如果您只有 1 个要并行化的 for 循环,请使用#pragma omp parallel for simd
.
如果要并行化多个 for 循环或在当前 for 循环之前或之后添加任何其他并行例程,请使用:
#pragma omp parallel
{
// Other parallel code
#pragma omp for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
// Other parallel code
}
这样您在添加更多并行例程时不必重新打开并行部分,从而减少开销时间。
推荐阅读
- ansible - Ansible jinja 2 模板值不应该改变
- spring - Externalise - spring cloud config server 多个 git repo 配置
- perl - 在 Perl 中正确显示 UTF-8 字符
- javascript - 有没有办法覆盖单元格之间导航的默认行为?
- angular - 离子构建的问题
- python - 将不同文件中的多个excel表导入python并将它们连接到一个数据框中
- jekyll - 使用 Jekyll 忽略 markdown 文件中的一行
- r - r 为 geom_label() 添加背景颜色
- pivot - 将行转换为列,并在所有先前的列中处理并保持相同的索引
- typescript - 未装箱条件下的 TypeScript 映射:将 OR 转换为 AND