gpt4 book ai didi

c++ - 使用 TBB parallel_for_each() 减少原子计数器

转载 作者:行者123 更新时间:2023-11-28 06:53:15 27 4
gpt4 key购买 nike

这是我用于 TBB 代码的原子计数器类。

#include <atomic>
template <typename T = int>
struct AtomicCounter {

private:
std::atomic<T> value;
std::atomic<T> num_inter;

public:
void put_inter(T niter) {
T x = num_inter.fetch_add(niter);
}

T get_inter() { return num_inter.load(); }

void increment() { ++value; }
void put(T data) { value.fetch_add(data) ; // ignore the old value returned }
void decrement() { --value; }
T get() { return value.load(); }

};

我正在使用并行 foreach 循环,其中每个线程都有自己的本地计数器值,并使用 AtomicCounter 类的 put 函数更新全局计数器对象。 parallel foreach 的函数对象将这个全局计数器作为引用。

template<typename counter_t>
struct my_functor {
public:
my_functor(){}
my_functor(counter_t &c):m_c(c){ }

template<typename label_t>
void operator()(label_t label) const {

// do some work --> local counter

m_c.put(local_value); // put the local counter value in the global counter
}

private:
counter_t& m_c;
mutable int local_value; //local counter value

}

// for TBB
//declare an object of this class as a global counter.

AtmoicCounter<int> c;
my_functor<atomicCounter<int>> func(c) //functor object
parallel_for_each( mywork.begin(), mywork.end(), func) //TBB parallel for each

基本上,每个线程都会更新全局计数器。我声明 std::atomic 成员的 atomicCounter 类有什么问题吗?我正在使用具有 C++11 功能和英特尔 TBB 4.2 的 GCC 4.7.2

谢谢!

最佳答案

我在声明中没有发现任何问题。如果您出于某种原因不确定 GCC 原子学,请使用我确定的 TBB 原子学。

但我看到的问题是使用 mutable 关键字来从 const 仿函数访问字段。 mutable 通常是糟糕设计的标志。在并行编程中,它的使用特别容易出错。如果并行调用的方法标记为 const,则通常意味着它将在仿函数类的同一实例上并行调用。因此,您在可变字段上发生了数据竞争。

您可以将 local_value 移动到 operator() 的范围内,而不是打破 const 限制,或者尝试线程本地容器 tbb::combinable tbb::enumerable_thread_specific 以缓存线程特定的部分值,或应用并行缩减算法 tbb::parallel_reduce,您可以在其中安全地将部分结果存储在仿函数的主体中。

关于c++ - 使用 TBB parallel_for_each() 减少原子计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486835/

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