Escribí dos clases de matriz en Java solo para comparar el rendimiento de sus multiplicaciones de matriz. Una clase (Mat1) almacena un miembro double[][] A
donde la fila i
de la matriz es A[i]
. La otra clase (Mat2) almacena A
y T
donde T
es la transposición de A
.¿Por qué el rendimiento de estas multiplicaciones de matriz es tan diferente?
Digamos que tenemos una matriz cuadrada M y queremos el producto de M.mult(M)
. Llame al producto P
.
Cuando M es un ejemplo Mat1 el algoritmo utilizado fue el sencillo uno:
P[i][j] += M.A[i][k] * M.A[k][j]
for k in range(0, M.A.length)
En el caso en que M es un mat2 utilicé:
P[i][j] += M.A[i][k] * M.T[j][k]
que es el mismo algoritmo porque T[j][k]==A[k][j]
. En las matrices de 1000x1000, el segundo algoritmo tarda aproximadamente 1,2 segundos en mi máquina, mientras que el primero tarda al menos 25 segundos. Esperaba que el segundo fuera más rápido, pero no por mucho. La pregunta es, ¿por qué es esto mucho más rápido?
Mi única suposición es que la segunda hace un mejor uso de las memorias caché de la CPU, ya que los datos se extraen en cachés en fragmentos de más de 1 palabra, y el segundo algoritmo se beneficia atravesando solo filas, mientras que la primera ignora los datos se extrajeron en las memorias caché yendo de inmediato a la fila siguiente (que es ~ 1000 palabras en la memoria, porque las matrices se almacenan en orden principal de fila), ninguno de los datos está almacenado en caché.
Le pregunté a alguien y pensó que era debido a los patrones de acceso a la memoria más amigables (es decir, que la segunda versión daría como resultado menos fallas suaves TLB). No pensé en esto en absoluto, pero puedo ver cómo resulta en menos fallas TLB.
Entonces, ¿cuál es? ¿O hay alguna otra razón para la diferencia de rendimiento?
http://en.wikipedia.org/wiki/Locality_of_reference –
Creo que esta pila de intercambio [propuesta] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "revisión de código") puede ser de su interés. Si es muestra de tu apoyo y ayuda a ponerlo en beta. – greatwolf