Estoy trabajando en una tarea y he estado atascado durante horas en mi solución. El problema que nos ha surgido es optimizar el siguiente código, para que funcione más rápido, independientemente de lo desordenado que se vuelva. Se supone que debemos usar cosas como explotar bloques de caché y desenrollar bucles.Optimización de la función de transposición de arrays
Problema:
//transpose a dim x dim matrix into dist by swapping all i,j with j,i
void transpose(int *dst, int *src, int dim) {
int i, j;
for(i = 0; i < dim; i++) {
for(j = 0; j < dim; j++) {
dst[j*dim + i] = src[i*dim + j];
}
}
}
Lo que tengo hasta ahora:
//attempt 1
void transpose(int *dst, int *src, int dim) {
int i, j, id, jd;
id = 0;
for(i = 0; i < dim; i++, id+=dim) {
jd = 0;
for(j = 0; j < dim; j++, jd+=dim) {
dst[jd + i] = src[id + j];
}
}
}
//attempt 2
void transpose(int *dst, int *src, int dim) {
int i, j, id;
int *pd, *ps;
id = 0;
for(i = 0; i < dim; i++, id+=dim) {
pd = dst + i;
ps = src + id;
for(j = 0; j < dim; j++) {
*pd = *ps++;
pd += dim;
}
}
}
Algunas ideas, por favor, corríjanme si me equivoco:
He pensado en bucle desenrollado pero No creo que eso ayude, porque no sabemos si la matriz NxN tiene dimensiones primarias o no. Si lo comprobé, incluiría cálculos en exceso que ralentizarían la función.
Los bloques de caché no serían muy útiles, porque no importa qué, vamos a acceder linealmente a una matriz (1,2,3,4) mientras que a la otra vamos a acceder en saltos de N. Si bien podemos obtener la función de abusar de la memoria caché y acceder al bloque src más rápido, todavía llevará mucho tiempo colocarlos en la matriz dst.
También he intentado usar punteros en lugar de accesadores de arreglo, pero no creo que realmente acelere el programa de ninguna manera.
Cualquier ayuda sería muy apreciada.
Gracias
Este es el camino a seguir. "transposición matricial inconsistente de caché" es la frase de google. Nota: al tomar 2 * 2 mosaicos de 16 * 16 líneas de caché, se llenan 4096 bytes, que es una página de memoria en (la mayoría) de las máquinas x86. – wildplasser
¡Sí! La optimización de los accesos a la memoria puede dar como resultado una mejora que vale la pena varias veces según mi experiencia. – sharptooth
esta es la respuesta correcta. optimización de caché >> el resto. –