Sono nuovo a High Performance Computing
e la mia prima domanda in questo forum in cui sono stato un lettore per molto tempo.Operazione aritmetica su array statici molto grandi in C/C++
Fondamentalmente ho bisogno di fare operazioni aritmetiche su matrici molto grandi come ad esempio
double variable [9][4][300][300][300] (uninitialized)
caso 1: Se dichiarare la matrice di cui sopra come local/automatic
allora ottengo errore runtime se avevo compilato senza ottimizzazione come "g++ file.cpp
" .. (l'errore è colpa di segmentazione - overflow dello stack ???)
caso 2: Nello stesso caso, come sopra, se ho avuto compi le con ottimizzazione il codice viene eseguito come previsto. "g++ -O2 file.cp
p"(è il array
in bss
ora ???)
caso 3: Se faccio la variabile global/static
allora compila bene ma comunque non funziona e dà solo un messaggio 'killed
' sul terminale e termina.
non esiste un vero problema, ma io sono curioso e vogliono imparare cosa succede quando estremamente grandi array sono dichiarati e dove risiedono in memoria a seconda del loro tipo di dati.
sono anche consapevole del metodo per generare questi array in fase di esecuzione usando malloc o nuovo. Quindi ovviamente sarebbe in ordine.
Quindi la domanda più importante per me è -> che è il metodo più efficiente (vale a dire più piccolo di run-time durante il calcolo degli array in memoria) di trattare con grandi array quando si compila con g++
e in esecuzione su linux clusters
.
Grazie per la vostra pazienza per la lettura.
Questo array è pura follia. È necessario utilizzare una soluzione più intelligente per elaborare quella quantità di dati a meno che la piattaforma di destinazione non sia una sorta di macchina bestiale. Dal momento che sembra non essere il caso, in streaming i dati dal disco in blocchi o qualcosa di simile. –
Questi array sono inevitabili. Rappresentano le variabili nello spazio a 4 dimensioni. E le operazioni di memoria risolvono l'equazione differenziale non lineare complessa. E alla fine il codice verrà eseguito su un cluster di 50 nodi con più di 100 GB di memoria. I dati sono infatti letti dal disco.La mia curiosità è nel capire dove si trovano questi dati in fase di esecuzione e in quale sezione (bss/stack/heap) si otterrebbero prestazioni di runtime più veloci. – physicist
Ti consiglio davvero di fare il tuo lavoro basandoti su alcune librerie matematiche come armadillo o BLAS. QUALSIASI COSA tu faccia e intendo QUALSIASI COSA, è impossibile battere le prestazioni di queste librerie. Considerate di usarli fin dall'inizio :) – amas