Stavo passando per i concetti di ordinamento parallelo introdotti in Java 8. Come da doc.Perché la granularità minima è definita come 8192 in Java8 per passare da Parallel Sort a Arrays.sort indipendentemente dal tipo di dati
Se la lunghezza della matrice specificato è inferiore al minimo granularità, allora è ordinato con il metodo Arrays.sort appropriato.
La specifica tuttavia non specifica questo limite minimo.
Quando ho guardato il codice in java.util.Arrays
è stata definita come
private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;
cioè valori nella matrice
Secondo la spiegazione fornita here. Capisco perché il valore era hardcoded come 8192.
È stato progettato tenendo presente l'architettura della CPU corrente.
Con l'opzione-XX:+UseCompressedOops
attivata per impostazione predefinita, qualsiasi sistema con meno di 32 GB di RAM utilizza puntatori a 32 bit (4 byte). Ora, con una dimensione L1 Cache di 32 KB per la porzione di dati, possiamo passare a 32 KB/4 byte = 8 KB di dati alla volta per la CPU per il calcolo. Questo è equivalente a 8192 byte di dati elaborati contemporaneamente.
Quindi per una funzione che sta lavorando sull'ordinamento di un array di byte parallelSort(byte[])
questo ha senso. È possibile mantenere il limite di ordinamento parallelo minimo come 8192 valori (ogni valore = 1 byte per l'array di byte).
ma se si considera public static void parallelSort(int[] a)
un numero intero variabile è di 4Byte (32-bit). Quindi idealmente degli 8192 byte, possiamo memorizzare 8192/4 = 2048 numeri nella cache della CPU in una sola volta. Così la granularità minima in questo caso è supponiamo di essere 2048.
Perché sono tutte le funzioni parallelSort in Java (che si tratti di byte [], int [], lungo [], ecc) utilizzando 8192 come predefinito min. numero di valori necessari per eseguire l'ordinamento parallelo?
Non dovrebbe variare in base ai tipi passati alla funzione parallelSort?