C型矩阵乘法(3个循环)比Eigen更快,这有意义吗? 我读了一些C编程教材来复习,而我个人喜欢C++的C语言(我的程序类型)的一个主要原因是本原线性代数。 所以今天我只是做了一个10x10矩阵乘法的简单测试,并测量了时间,令人惊讶的是,至少对我来说,C风
C型矩阵乘法(3个循环)比Eigen更快,这有意义吗? <>我读了一些C编程教材来复习,而我个人喜欢C++的C语言(我的程序类型)的一个主要原因是本原线性代数。C型矩阵乘法(3个循环)比Eigen更快,这有意义吗? 我读了一些C编程教材来复习,而我个人喜欢C++的C语言(我的程序类型)的一个主要原因是本原线性代数。 所以今天我只是做了一个10x10矩阵乘法的简单测试,并测量了时间,令人惊讶的是,至少对我来说,C风,c++,c,eigen,C++,C,Eigen,C型矩阵乘法(3个循环)比Eigen更快,这有意义吗? 我读了一些C编程教材来复习,而我个人喜欢C++的C语言(我的程序类型)的一个主要原因是本原线性代数。 所以今天我只是做了一个10x10矩阵乘法的简单测试,并测量了时间,令人惊讶的是,至少对我来说,C风格已经被证明是相当快的。在释放模式中,我尝试将随机值放入矩阵中。在初始化矩阵的过程中,编译器可能能够计算结果并跳过所有运行时乘法运算。您是否查看过asm以查看第一个代码是否没有完全内联?(所以根本没有计算)。@Barmar我再次运行它,对所有矩
所以今天我只是做了一个10x10矩阵乘法的简单测试,并测量了时间,令人惊讶的是,至少对我来说,C风格已经被证明是相当快的。在释放模式中,我尝试将随机值放入矩阵中。在初始化矩阵的过程中,编译器可能能够计算结果并跳过所有运行时乘法运算。您是否查看过asm以查看第一个代码是否没有完全内联?(所以根本没有计算)。@Barmar我再次运行它,对所有矩阵初始化为rand(),得到了类似的结果,C~1ms和Eigen稍微慢一些~20msEigen的速度只有多倍矩阵的一半,根据一些快速检查,速度不是12到20倍。(这些不是科学结果)。你在用优化来计时吗?在这个问题上没有关于C的任何东西,不要不加区分地标记,试着将随机值放入矩阵中。在初始化矩阵的过程中,编译器可能能够计算结果并跳过所有运行时乘法运算。您是否查看过asm以查看第一个代码是否没有完全内联?(所以根本没有计算)。@Barmar我再次运行它,对所有矩阵初始化为rand(),得到了类似的结果,C~1ms和Eigen稍微慢一些~20msEigen的速度只有多倍矩阵的一半,根据一些快速检查,速度不是12到20倍。(这些不是科学结果)。你是在用优化来计时吗?在这个问题上没有关于C的任何东西,不要不加区分地标记
// function to multiply two matrices
void multiplyMatrices(int first[][10],
int second[][10],
int result[][10],
int r1, int c1, int r2, int c2) {
// Multiplying first and second matrices and storing it in result
for (int i = 0; i < r1; ++i) {
for (int j = 0; j < c2; ++j) {
// Init matrix
result[i][j] = 0;
for (int k = 0; k < c1; ++k) {
result[i][j] += first[i][k] * second[k][j];
}
}
}
}
int main() {
int first[10][10], second[10][10], result[10][10];
// Initializing elements to something arbitrary
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
first[i][j] = i * j;
second[i][j] = (i + 3) * j;
}
}
// multiply two matrices, only time the multiplication
auto t1 = std::chrono::high_resolution_clock::now();
multiplyMatrices(first, second, result, 10, 10, 10, 10);
auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
std::cout << "C style: " << duration << std::endl;
// Initialize the matrices to a fixed size
Eigen::Matrix<int, 10, 10> f1(10, 10);
Eigen::Matrix<int, 10, 10> f2(10, 10);
Eigen::Matrix<int, 10, 10> r(10, 10);
// Same initialization values as C style
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
f1(i, j) = i * j;
f2(i, j) = (i + 3) * j;
}
}
// Only time the multiplication
t1 = std::chrono::high_resolution_clock::now();
r = f1 * f2;
t2 = std::chrono::high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
std::cout << "Eigen: " << duration << std::endl;