C型矩阵乘法(3个循环)比Eigen更快,这有意义吗? 我读了一些C编程教材来复习,而我个人喜欢C++的C语言(我的程序类型)的一个主要原因是本原线性代数。 所以今天我只是做了一个10x10矩阵乘法的简单测试,并测量了时间,令人惊讶的是,至少对我来说,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我再次运行它,对所有矩

C型矩阵乘法(3个循环)比Eigen更快,这有意义吗? <>我读了一些C编程教材来复习,而我个人喜欢C++的C语言(我的程序类型)的一个主要原因是本原线性代数。
所以今天我只是做了一个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;