Un generatore di numeri primi più rapido con hyperthreading e cache L1
Circa cinque anni fa ho scritto un semplice widget VB per generare il primo milione di numeri primi e quindi portarli nel suo singolo listBox VB. Ci sono volute circa quattro ore su un Athlon 1.4 GHz con 1GB di DDR per PC-3200. Mi chiedevo alcuni suggerimenti e trucchi per accelerare notevolmente questo processo con l'ottimizzazione dell'hardware a basso livello e la gestione della memoria in C.
Più tardi mi è venuto in mente che tutti i numeri primi oltre i dieci terminano in 1, 3, 7 o 9 quindi perché non impostare un algoritmo da eseguire in ciascun core di un processore quad-core e, se possibile, specificarlo l'algoritmo viene eseguito all'interno della cache L1.
Che cosa succede se saliamo a 100.000.000, quindi ogni ramo di questa app valuterà 10.000.000 di candidati primi e restituirà circa 1.000.000 di risultati
ser[1]=new Array(1000000);
ser[3]=new Array(1000000);
ser[7]=new Array(1000000);
ser[9]=new Array(1000000);
void run_array_loader(seed)
{
for(n=seed+10;n<100000000;n+=10)
{
for(x=3;x<sqrt(n);x+=2)
{
n%x==0?break;:continue;
}
ser[seed][]=n;
}
}
run_array_loader(1); //in core[0]
run_array_loader(3); //in core[1]
run_array_loader(7); //in core[2]
run_array_loader(9); //in core[3]
Quali metodi utilizzeremmo per accelerare e per specificare l'allocazione di base e l'utilizzo della cache?
20 ottobre: ecco una ripartizione dei risultati in C ++
Riepilogo
33:46 per eseguire 31.209 miliardi di calcoli, identificando 5.762.681 numeri primi