需要帮助解决特征数组并行构造中的数据争用
Need help resolving data contention in parallel construction of Eigen arrays
我刚刚在我的程序上运行了一个并发分析器,发现了一行经常在内存中的线程之间争用的代码,即;
// declarations shown here to clarify type:
size_t const timeSteps;
typedef Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic> Signal2D;
Signal2D Activations(timeSteps, desc.length()); // this line is contended
请注意,我声明了#define EIGEN_DONT_PARALLELIZE
以避免特征运算的隐式并行化。
上述行在多个线程上并发执行,但desc
实例是线程的本地类。那么,为什么这段代码在线程之间竞争呢?
在VS2013分析器中,它说正在争用的特定代码是Eigen::DenseStorage<float,-1,-1,-1,0>::resize
。为什么会这样?Eigen 是否以某种方式跟踪线程之间创建和销毁了哪些数组?为什么?我该如何关闭它?
我想这是因为这个调整大小函数通过对 malloc 的系统调用来执行内存分配。所以我认为实际问题出在malloc。最好的解决方案是通过预先分配所需的数组来避免动态内存分配,并迁移到更类似于 C 的 API 进行激活()。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 并行块(线程清理器)之外的 OpenMP 中的争用条件;误报?
- 如何在C++中创建争用条件
- C++上的手动重置事件(来自 C#)实现:如何避免争用条件
- 作为随机数生成器的争用条件
- 设计低线程争用的多线程聊天服务器
- 智能指针析构函数争用条件
- 尽管互斥锁,线程中的争用条件
- ThreadSanitizer 报告的数据争用
- 在C++中递增和递减全局变量时的争用条件
- 线程清理器检测到数据争用,问题出在哪里?
- 为什么此代码不创建争用条件?
- 防止派生析构函数中的 vtable 数据争用
- __has_include() 和后续 #include 之间是否存在争用条件
- 一次加载整个缓存行以避免争用其中的多个元素
- 为什么此示例中没有使用 if 语句的数据争用?
- 需要帮助解决特征数组并行构造中的数据争用
- GCC 的 TSAN 报告了线程安全静态本地的数据争用
- 使用packaged_task和线程可能的数据争用
- 将相同的值写入相同的内存位置是否会导致数据争用?