我刚刚在我的程序上运行了一个并发分析器,并发现了一行代码在内存中的线程之间经常争用,即;
// 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 是否以某种方式跟踪线程之间创建和销毁的数组?为什么?以及如何关闭它?