Tengo un programa que recibe datos tridimensionales como matrices planas en la primera fila (A.K.A. "C") ordena como entrada.

Necesito pasarlos a una biblioteca que espera los mismos datos tridimensionales en la orden principal de la columna (A.K.A. "Fortran").
El preprocesamiento de las matrices fuera de mi programa no es una opción.

Transformar los datos mientras la copia no es un problema, excepto para el rendimiento, hay bastantes matrices de varios millones de elementos cada uno, y la asignación y la copia es mi cuello de botella importante, por lo que me gustaría hacer la transformación en el lugar y ver si eso ayuda. .

Sin embargo, no he podido resolver las matemáticas detrás de esta transformación, y mi Google ha sido menos que útil.
¿Existe una forma eficiente de realizar esta transformación en el lugar?

3
molbdnilo 1 jul. 2019 a las 13:16

1 respuesta

La mejor respuesta

Una transformación en el lugar (si es posible) copiaría todos los elementos de estas grandes matrices de todos modos, por lo que no será amigable con caché.
Cada asignación se realizará una vez por una gran matriz (y su posterior transformación larga) y, si tiene que lidiar con un flujo de tales matrices, podría reutilizar a las antiguas para evitar las repeticiones de Alloc / Free.

Simplemente recomendaría cargar los datos en el orden principal de fila de fila predictible / de caché y confíe en la maquinaria de almacenamiento-tampón para lidiar con la tienda principal de la columna anti-patrón a la segunda matriz (asignada).

1
prog-fh 1 jul. 2019 a las 10:45