私はジェネリックMatrix
クラスを持っています。値の行列を扱うときのために、SSE に最適化された行列乗算関数がありFloat
ます。現在、私の方法論には、いくつかのチェックを含む行列乗算による行列を行う「doSSE_mulMM」という名前の関数が含まれていますが、関連するのはMatrix<Float>
(コードで SSE 機能のチェックを行い、以下に移動するため、部分的に存在します)。 SSE が利用できない場合の効率的な乗算)。
ビルド サーバーが実行している GCC のバージョンでは、次のエラーが発生します。
error: specialization of ‘MTI::Matrix<float>& MTI::Matrix<BT>::doSSE_MulMM(const MTI::Matrix<float>&, const MTI::Matrix<float>&, bool) [with BT = float]’ after instantiation
同じコードは、Visual Studio と、Linux ホスト上の古いバージョンの GCC で正常にコンパイルされます。
完全なコードを提供することはできませんが、これらは関数のシグネチャです。
Matrix.h
template <class BT>
class Matrix {
....
Matrix<Float>& doSSE_MulMM (const Matrix<Float>& mat1, const Matrix<Float>& mat2, bool softmax);
....
}
マトリックス.cpp
template <>
Matrix<Float>& Matrix<Float>::doSSE_MulMM (const Matrix<Float>& mat1,
const Matrix<Float>& mat2,
bool softmax) {
....
}
関数doSSE_MulMM
only は実際には Float 行列に対して意味がありますが、Matrix のプライベート データ メンバーで動作するため、メンバー関数にすることを強くお勧めします。Matrix クラスの 1 つの特殊化にのみ存在するように関数を特殊化する良い方法はありますか? 他のデータ型に対して例外を発生させる一般的なバージョンを導入できると思いますが、それは面倒です。