OpenMP 不在 for 循环中的顺序函数的并行化
OpenMP Parallelization of sequential functions that are not within a for loop
GlobalDefines.h
具有以下#defined
#define FOO_1 true//true if function void foo1() should run, false otherwise
#define FOO_2 false//true if function void foo2() should run, false otherwise
在src.cpp
中,这些用于:
#include GlobalDefines.h
class BigClassX{
std::vector<int>...;
....
};
BigClassX ObjX;
int main(){
#if FOO_1
foo1(objX);
#if FOO_2
foo2(objX);
}
foo1
(同样foo2
)通过引用来接受它的论证:
void foo1(class BigClassX& objX){}
我想并行化foo1
和foo2
即使它们不在for
循环中。
我的尝试如下,这似乎有点迂回,因为我明确必须引入一个for
循环:
#pragma omp parallel for
for(int i = 1; i <= 2; i++)
foox(i, objX);
现在,foox
是:
void foox(int indicator, class BigClassX& objX){
if(FOO_1 && indicator == 1)
foo1(objX);
if(FOO_2 && indicator == 2)
foo2(objX);
}
有没有其他方法可以在 OpenMP 中并行化它?我对上述方法的担忧是:
(1)在 OpenMPparallel for
构造中通过引用传递大对象objX
是否会对性能造成影响?由于它是一个大对象,我无论如何都会通过引用传递它,但是在将其放置在 OpenMPparallel for
构造中时,我应该特别担心什么吗?
(2)如上所述,这似乎有点圆,因为我必须在foox
引入一个新函数,并且在foox
中我必须根据indicator
检查要调用哪个函数。
1. 不要像这样滥用预处理器。
只是不要 - 除非它是绝对不可避免的。除了你的例子是缺少#endif
.你会用这个烧伤自己或别人,你会受苦。而不是使用if constexpr
- 或者只是常规的,如果在const
或constexpr
.这很好。
2. 这是 OpenMP 部分的用例
您的代码看起来像
#pragma omp parallel sections
{
#pragma omp section
{
foo1(objX);
}
#pragma omp section
{
foo2(objX);
}
}
3. 避免竞争条件
通常,此对象在各节之间共享,并将相同的引用传递给foo1
和foo2
。并行处理共享对象是危险的。您必须避免访问objX
中的相同叶元素(单个值),除非仅读取所有部分。
根据您的具体情况,您可以使用atomic
操作或critical
部分来防止争用条件。
相关文章:
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 如何使用 Pthreads 并行化图像翻转?
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- OpenMP 不在 for 循环中的顺序函数的并行化