問題は、「式テンプレート(ET)」という用語ですでに始まっています。正確な定義があるかどうかはわかりません。しかし、その一般的な使用法では、「線形代数式のコーディング方法」と「計算方法」が何らかの形で組み合わされています。例えば:
ベクトル演算をコーディングします
v = 2*x + 3*y + 4*z; // (1)
そして、それはループによって計算されます
for (int i=0; i<n; ++i) // (2)
v(i) = 2*x(i) + 3*y(i) + 4*z(i);
私の意見では、これは2つの異なるものであり、分離する必要があります。(1)インターフェイスであり、(2)1つの可能な実装です。これはプログラミングの一般的な方法です。確かに(2)は適切なデフォルトの実装かもしれませんが、一般的には、専用の専用実装を利用できるようにしたいと考えています。たとえば、次のような関数が必要です
myGreatVecSum(alpha, x, beta, y, gamma, z, result); // (3)
コーディング中に呼び出されます(1)。多分(3)は(2)のようなループを内部的に使用するだけです。ただし、ベクターのサイズによっては、他の実装の方が効率的な場合があります。とにかく、高性能の専門家は可能な限り実装(3)することができます。(1)を(3)の呼び出しにマッピングできない場合は、(1)の構文糖を避けて、すぐに(3)を直接呼び出します。
私が説明するのは新しいことではありません。それどころか、BLAS / LPACKの背後にある考え方です。
- LAPACKのすべてのパフォーマンスクリティカルな操作は、BLAS関数を呼び出すことによって実行されます。
- BLASは、一般に必要な線形代数式のインターフェイスを定義するだけです。
- BLASには、さまざまな最適化された実装が存在します。
BLASのスコープが十分でない場合(たとえば(3)のような機能を提供しない場合)、BLASのスコープを拡張できます。したがって、60年代と70年代のこの恐竜は、石器時代のツールを使用して、インターフェイスと実装を明確かつ直交的に分離しています。(ほとんどの)数値C ++ライブラリがこのレベルのソフトウェア品質を達成しないのは、ちょっとおかしいです。プログラミング言語自体は非常に洗練されていますが。したがって、BLAS / LAPACKがまだ生きており、積極的に開発されていることは驚くことではありません。
したがって、私の意見では、ETはそれ自体悪ではありません。しかし、それらが数値C ++ライブラリで一般的に使用される方法は、科学コンピューティング界で非常に悪い評判を得ました。