Ho bisogno di leggere una quantità enorme di dati in un buffer (circa 20gig). Ho 192gb di DDram molto veloce disponibile, quindi nessun problema con le dimensioni della memoria. Tuttavia, sto trovando che il seguente codice si esegue più lentamente e più lentamente tanto più diventa nel buffer. Il profiler di Visual C mi dice che il 68% del tempo di esecuzione di 12 minuti è nelle istruzioni 2 all'interno del ciclo in myFunc(). Sto facendo funzionare win7, 64bit su un dell molto veloce con 2 cpu, 6 core fisici ciascuno (24 core logici), e tutti e 24 i core sono completamente al massimo durante l'esecuzione di questo.Problema di velocità con enorme array C utilizzando 64 bit Visual C
#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) ];
// ....
}
}
È possibile ottimizzare il codice eliminando le moltiplicazioni (spostando o aggiunte). Ma questo potrebbe non risolvere il problema del ciclo che si sta facendo più lento. – thumbmunkeys
Perché stai assegnando ptxValue e lastPtxValue nel ciclo? Entrambi i compiti sembrano essere indipendenti dal ciclo. – ArjunShankar
Le mie scuse ... nel tentativo di semplificare il codice, ho sbagliato (la versione modificata è sopra). All'interno del ciclo 'for' c'è un valore che cambia, motivo per cui i calc devono essere ripetuti più e più volte. – PaeneInsula