例如,我想使用AVX2实现一个矩阵乘法模板函数。(假设“Matrix”是一个实现良好的模板类)
Matrix<T> matmul(const Matrix<T>& mat1, const Matrix<T>& mat2) {
if (typeid(T).name() == typeid(float).name()) {
//using __m256 to store float
//using __m256_load_ps __m256_mul_ps __m256_add_ps
} else if (typeid(T).name() == typeid(double).name()) {
//using __m256d to store double
//using __m256d_load_pd __m256d_mul_pd __m256d_add_pd
} else {
//...
}
}
由于没有数据类型的“变量”,程序无法确定是否应该使用__m256或__m256d或其他任何东西,从而使代码变得非常长和笨拙。有没有其他方法可以避免这种情况?
2条答案
按热度按时间hgb9j2n61#
在C++17和更高版本中,可以使用
if constexpr
:否则,只需使用重载:
1sbrub3j2#
首先,您可以为函数
_mm256_load_*
和_mm256_mul_*
等创建重载:然后,您可以创建一个类型特征,为
float
和double
给予正确的AVX类型:最后一个函数可以使用上面的重载函数和类型特征,并且不需要像原始函数那样进行任何运行时检查: