0

我刚刚在我的程序上运行了一个并发分析器,并发现了一行代码在内存中的线程之间经常争用,即;

// 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要避免 Eigen 操作的隐式并行化。

上面的行在多个线程上同时执行,但desc实例是线程本地的类。那么为什么这段代码会在线程之间竞争呢?

在 VS2013 分析器中,它表示正在竞争的特定代码是Eigen::DenseStorage<float,-1,-1,-1,0>::resize. 为什么会出现这种情况?Eigen 是否以某种方式跟踪线程之间创建和销毁的数组?为什么?以及如何关闭它?

4

1 回答 1

1

我猜这是因为这个 resize 函数通过对 malloc 的系统调用来执行内存分配。所以我认为实际的问题在于malloc。最好的解决方案是通过预先分配所需的数组来避免动态内存分配,并为 Activations() 迁移到更类似于 C 的 API。

于 2013-11-05T08:58:24.437 回答