C++ 矩阵库是否将复合向量运算转换为单循环?

计算科学 线性代数 软件 C++
2021-11-25 15:45:26

我正在尝试使用 C++ 库复制 Fortran90 数组语法。在这个问题中详细讨论了库本身他们都可以这样做:

D = alpha*A + beta*B + gamma*C

对于向量 A、B、C 和标量 alpha、beta、gamma。这可以翻译为:

for (i = 0; i < D.length; i++)
  D[i] = alpha*A[i] + beta*B[i] + gamma*C[i]

它遍历每个数组一次,或者像:

for (i = 0; i < D.length; i++)
  D[i] = alpha*A[i] + beta*B[i]
for (i = 0; i < D.length; i++)
  D[i] += gamma*C[i]

第一种方法对于缓存性能要好得多,我认为这是 fortran 编译器所做的。C++ 矩阵库是否能够将复合向量表达式转换为像 fortran 这样的单个循环,或者它们会发出多个简单循环?

1个回答

这可以通过表达式模板在 C++ 中实现。技术报告的第 1.9 节解决了您的问题。