gpt4 book ai didi

c++ - 不在 for 循环内的顺序函数的 OpenMP 并行化

转载 作者:行者123 更新时间:2023-11-28 04:18:46 25 4
gpt4 key购买 nike

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){}

我想并行化 foo1foo2,即使它们不在 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)在 OpenMP parallel for 构造中通过引用传递大对象 objX 是否会影响性能?由于它是一个大对象,我无论如何都会通过引用传递它,但是在将它放在 OpenMP parallel for 构造中时,有什么我应该特别担心的吗?

(2) 如上所述,这似乎有点迂回,因为我必须引入一个新函数 foox 并且在 foox 中我必须检查要使用哪个函数根据 indicator 调用。

最佳答案

1。不要像这样滥用预处理器。

只是不要 - 除非它是绝对不可避免的。此外,您的示例缺少 #endif。你用这个烧伤自己或他人,你受苦。而不是使用 if constexpr - 或者只是 constconstexpr 上的常规 if。这很好。

2。这是 OpenMP 部分的用例

你的代码看起来像

#pragma omp parallel sections
{
#pragma omp section
{
foo1(objX);
}
#pragma omp section
{
foo2(objX);
}
}

3。避免竞争条件

通常,该对象在各部分之间共享,并且相同的引用传递给foo1foo2。并行处理共享对象是危险的。您必须避免访问 objX 中相同的 leaf 元素(单独的值),除非所有 部分只读

根据您的具体情况,您可以使用原子 操作或关键 部分来防止竞争条件。

关于c++ - 不在 for 循环内的顺序函数的 OpenMP 并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55968563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com