gpt4 book ai didi

c++ - 在无法应用omp atomic/reduction的情况下,使用omp critical我们可以做些什么来提高效率呢?

转载 作者:行者123 更新时间:2023-11-27 22:35:59 25 4
gpt4 key购买 nike

我在 C++ 中遇到一个问题。

假设我们有 vector<SomeClass> v我们想添加 v 的所有元素使用多线程。 (v 的大小是 N 。)我们有一个重载 += SomeClass 中的运算符但这不是原子兼容的。

SomeClass sum; // init by "zero" but not exactly a single (int)
#pragma omp parallel for
for (int i=0; i<N; ++i) {
#pragma omp critical
{
sum += v[i];
}
}

我的实验表明这段代码的运行时间和单线程的差不多。我认为这是由于 critcial一次只允许一个线程评估加法的部分。 (我不能利用多线程)。替代方法是使用 atomic或 ( reduction ),但它们不可用,因为 +=不适用于原子变量。

遇到这种情况,我们该怎么办?我应该在这里退出使用多线程吗?非常感谢。

最佳答案

你需要做一个减少。如果 openMP 的标准 reduction(op:var) 指令不支持该类,您可以手动添加它。

每个线程将 vector 值相加到一个私有(private)累加器中。然后,将私有(private)累加器求和到一个全局累加器中(对于整个循环,每个线程只需执行一次,而不是在每次迭代时执行一次)

SomeClass sum; // init by "zero" but not exactly a single (int)
#pragma omp parallel
{
SomeClass mySum=0; //local accumulator, init with 0 or whatever the "zero" is for that class
#pragma omp for
for (int i=0; i<N; ++i) mySum += v[i];

#pragma omp critical
sum += mySum; //The critical section is entered only once
}

关于c++ - 在无法应用omp atomic/reduction的情况下,使用omp critical我们可以做些什么来提高效率呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54093427/

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