通用函数模板体系设计
- 矩阵类模板定义
template <typename T, size_t rows, size_t cols>
class Matrix {
public:
Matrix() = default;
// 初始化矩阵数据的构造函数
Matrix(const T(&data)[rows][cols]) {
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
m_data[i][j] = data[i][j];
}
}
}
T m_data[rows][cols];
};
- 矩阵乘法模板函数
template <typename T, size_t rows1, size_t cols1, size_t cols2>
Matrix<T, rows1, cols2> multiply(const Matrix<T, rows1, cols1>& m1, const Matrix<T, cols1, cols2>& m2) {
Matrix<T, rows1, cols2> result;
for (size_t i = 0; i < rows1; ++i) {
for (size_t j = 0; j < cols2; ++j) {
T sum = static_cast<T>(0);
for (size_t k = 0; k < cols1; ++k) {
sum += m1.m_data[i][k] * m2.m_data[k][j];
}
result.m_data[i][j] = sum;
}
}
return result;
}
- 矩阵转置模板函数
template <typename T, size_t rows, size_t cols>
Matrix<T, cols, rows> transpose(const Matrix<T, rows, cols>& m) {
Matrix<T, cols, rows> result;
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
result.m_data[j][i] = m.m_data[i][j];
}
}
return result;
}
不同编译器环境下的优化
- 使用预编译头文件
- GCC和Clang:可以通过
-include
选项指定预编译头文件。例如,将常用的头文件(如 <iostream>
、<type_traits>
等)放在一个头文件 precompiled.h
中,编译时使用 -include precompiled.h
。
- MSVC:使用
/Yu
选项指定预编译头文件。例如,cl /Yu"precompiled.h" source.cpp
。预编译头文件可以减少重复编译,提高编译速度。
- 优化编译选项
- GCC和Clang:
-O3
选项用于最高级别的优化,会对代码进行各种优化,如内联函数、循环展开等,提高运行效率。例如,g++ -O3 -c source.cpp
。
-flto
(链接时优化)选项可以在链接阶段进行跨模块优化,进一步提升性能。例如,g++ -flto -o executable source1.o source2.o
。
- MSVC:
/O2
选项启用完全优化,类似GCC的 -O3
。例如,cl /O2 source.cpp
。
/GL
(全程序优化)选项结合链接器的 /LTCG
(链接时代码生成)选项,实现类似GCC的 -flto
功能,进行跨模块优化。例如,cl /GL source1.cpp source2.cpp
然后 link /LTCG
。
- 模板特化与优化
- 对于特定维度的矩阵(如2D和3D),可以进行模板特化。例如,对于2D矩阵乘法,可以特化
multiply
函数模板,手动展开循环,减少循环控制开销,提高运行效率。
template <typename T>
Matrix<T, 2, 2> multiply(const Matrix<T, 2, 2>& m1, const Matrix<T, 2, 2>& m2) {
Matrix<T, 2, 2> result;
result.m_data[0][0] = m1.m_data[0][0] * m2.m_data[0][0] + m1.m_data[0][1] * m2.m_data[1][0];
result.m_data[0][1] = m1.m_data[0][0] * m2.m_data[0][1] + m1.m_data[0][1] * m2.m_data[1][1];
result.m_data[1][0] = m1.m_data[1][0] * m2.m_data[0][0] + m1.m_data[1][1] * m2.m_data[1][0];
result.m_data[1][1] = m1.m_data[1][0] * m2.m_data[0][1] + m1.m_data[1][1] * m2.m_data[1][1];
return result;
}
- 编译器内置函数
- 一些编译器提供内置函数用于特定的数学运算,如Intel编译器的SSE/AVX指令集相关的内置函数。可以利用这些内置函数优化矩阵运算中的乘法和加法操作,提高运行效率。例如,在支持SSE指令集的环境下,可以使用
_mm_mul_ps
和 _mm_add_ps
等函数进行单精度浮点矩阵运算的优化。具体使用方法需要根据编译器文档和目标平台的指令集支持情况进行调整。