Eigen张量如何避免临时对象内存分配?noalias方法失效求解
Eigen张量运算避免临时对象内存分配的解决方案
问题根源
Eigen的张量模块与矩阵模块的表达式优化机制不同,矩阵模块的noalias()方法并不适用于张量类型;而链式张量运算(如Tensor1 * Tensor2 * 1i)会创建临时张量存储中间结果,触发堆内存分配,进而导致性能下降、内存占用过高。
解决方案
使用张量表达式的evalTo()方法,直接将整个运算的结果计算到目标张量中,完全避免临时对象的创建:
- 修改运算逻辑
将原赋值语句替换为evalTo()调用,直接在Product的内存空间中计算表达式结果:
void TensorProduct(Eigen::Tensor<std::complex<double>, 3>& Tensor1, Eigen::Tensor<double, 3>& Tensor2, Eigen::Tensor<std::complex<double>, 3>& Product){ // 直接将运算结果写入Product,无临时对象分配 (Tensor1 * Tensor2 * std::complex<double>(0, 1)).evalTo(Product); }
- 优化参数传递
原函数中Tensor2按值传递会创建副本,改为引用传递进一步减少内存开销:
// 将Tensor2的参数改为非const引用(若无需修改可改为const引用) void TensorProduct(Eigen::Tensor<std::complex<double>, 3>& Tensor1, Eigen::Tensor<double, 3>& Tensor2, Eigen::Tensor<std::complex<double>, 3>& Product){ (Tensor1 * Tensor2 * std::complex<double>(0, 1)).evalTo(Product); }
验证效果
修改后重新运行代码,Eigen::internal::set_is_malloc_allowed(false)不会再触发断言错误,说明无临时对象的堆内存分配,代码的运行效率和内存占用将得到明显优化。
内容的提问来源于stack exchange,提问作者Mathew77
相关产品推荐
相关产品推荐

