Necesito leer una gran cantidad de datos en un búfer (aproximadamente 20 gig). Tengo 192 gb de DDram muy rápido disponible, así que no hay problema con el tamaño de la memoria. Sin embargo, estoy descubriendo que el siguiente código se ejecuta más lento y más lento cuanto más se acerca al búfer. El generador de perfiles de Visual C me dice que el 68% del tiempo de ejecución de 12 minutos está en las 2 instrucciones dentro del ciclo en myFunc(). Estoy ejecutando win7, 64 bits en un dell muy rápido con 2 CPU, 6 núcleos físicos cada uno (24 núcleos lógicos), y los 24 núcleos están completamente al máximo mientras se ejecuta esto.Problema de velocidad con la gran matriz C utilizando Visual C de 64 bits
#define TREAM_COUNT 9000
#define ARRAY_SIZE ONE_BILLION
#define offSet(a,b,c,d) (((size_t) ARRAY_SIZE * (a)) + ((size_t) TREAM_COUNT * 800 * (b)) + ((size_t) 800 * (c)) + (d))
void myFunc(int dogex, int ptxIndex, int xtreamIndex, int carIndex)
{
short *ptx = (short *) calloc(ARRAY_SIZE * 20, sizeof(short));
#pragma omp parallel for
for (int bIndex = 0; bIndex < 800; ++bIndex)
doWork(dogex, ptxIndex, carIndex);
}
void doWork(int dogex, int ptxIndex, int carIndex)
{
for (int treamIndex = 0; treamIndex < ONE_BILLION; ++treamIndex)
{
short ptxValue = ptx[ offSet(dogex, ptxIndex, treamIndex, carIndex) ];
short lastPtxValue = ptx[ offSet(dogex, ptxIndex-1, treamIndex, carIndex) ];
// ....
}
}
Puede optimizar el código eliminando las multiplicaciones (ya sea mediante desplazamiento o adición). Pero aún así eso podría no resolver su problema de que el ciclo se vuelva más lento. – thumbmunkeys
¿Por qué asigna ptxValue y lastPtxValue en el ciclo? Ambas asignaciones parecen ser independientes del bucle. – ArjunShankar
Mis disculpas ... al tratar de simplificar el código, lo entendí mal (la versión editada está arriba). Dentro del ciclo 'para' hay un valor cambiante, que es la razón por la cual los cálculos deben hacerse una y otra vez. – PaeneInsula