¿Cómo acelerar la multiplicación de matrices en C ++?

Estoy realizando la multiplicación de matrices con este algoritmo simple. Para ser más flexible, utilicé objetos para las matrices que contienen matrices creadas dinámicamente.

Comparando esta solución con la primera con matrices estáticas es 4 veces más lenta. ¿Qué puedo hacer para acelerar el acceso a los datos? No quiero cambiar el algoritmo.

 matrix mult_std(matrix a, matrix b) {
 matrix c(a.dim(), false, false);
 for (int i = 0; i < a.dim(); i++)
  for (int j = 0; j < a.dim(); j++) {
   int sum = 0;
   for (int k = 0; k < a.dim(); k++)
    sum += a(i,k) * b(k,j);
   c(i,j) = sum;
  }

 return c;
}

EDITARCorrija mi pregunta evitar! Agregué el código fuente completo a continuación y probé algunos de tus consejos:

intercambiadok yj iteraciones de bucle -> mejora del rendimientodeclaradodim() yoperator()() comoinline -> mejora del rendimientopasar argumentos por referencia constante ->pérdida de rendimiento! ¿por qué? así que no lo uso

El rendimiento ahora es casi el mismo que en el viejo programa. Tal vez debería haber un poco más de mejora.

Pero tengo otro problema: me sale un error de memoria en la funciónmult_strassen(...). ¿Por qué?
terminate called after throwing an instance of 'std::bad_alloc'<br>what(): std::bad_alloc

PROGRAMA ANTIGUO
C Principalhttp://pastebin.com/qPgDWGpW

c99 main.c -o matrix -O3

NUEVO PROGRAMA
matriz.hhttp://pastebin.com/TYFYCTY7
matrix.cpphttp://pastebin.com/wYADLJ8Y
main.cpphttp://pastebin.com/48BSqGJr

g++ main.cpp matrix.cpp -o matrix -O3.

EDITARAquí hay algunos resultados. Comparación entre el algoritmo estándar (estándar), el orden intercambiado del bucle j y k (intercambio) y el algoritmo bloqueado con el tamaño de bloque 13 (bloque).

Respuestas a la pregunta(7)

Su respuesta a la pregunta