@fweil
En espérant que le principe de cribler N * N comme premier crible de chaque nombre premier N soit mathématiquement viable, le carré de N n'est pas le seul saut "faisable".
Pour chaque nombre premier N "observé" (d'où mon insistance bête et méchante à maintenir la condition "If Multiple(N) = 0" en pensant qu'avant de cribler, Erathostène "regardait" son crible... Au cas où-!-) :
1) On cherche Na le nombre premier précédent
2) S'il n'y en a pas (avec : N = 2), Na = 1
3) On calcule L0, la p-Factorielle de Na
4) Rappel : p-Fact(1) = 1
5) On commence la "quête" et "enquête" avec x = 0 : chaque nombre récupéré sera Q0, Q1, ..., Qx.
N0 = N
5a) On prend N1, le Nb1er suivant notre Nb1er N0.
5b) On calcule Qx = N1 - N0 (gap)
5c) On calcule Sq la somme des Qx
5d) Sq > L0 ?
5e) Oui, on quitte l'étape 5, le tableau aligné Q(x) contient les valeurs prêtes à être traitées avec les AVX
5f) Non, on translate N0 = N1...
5g) ... Et on retourne à l'étape "5a"
6) Transfert AVX ("load")
7) Multiplication AVX des gaps Q(x) par N
Criblage
La p-Factorielle générale étant un dangereux goufre à ressources, autant pré-calculer la séquence de 7 avec ses 8 gaps :
4, 2, 4, 2, 4, 6, 2, 6
Comparativement, il me semble que tu faisais :
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
Donc le gain possible avec AVX serait :
1, 0, 1, 0, 1, 2, 0, 2 somme = 7 sauts de gagnés sur 15 (un peu moins de 50% de gains pour 2 registres YMMn utilisés).
Application du protocole ci-dessus avec 7
1) On cherche Na le nombre premier précédent
Na = 5
3) On calcule L0, la p-Factorielle de Na
L0 = p-Fact(5) = 5 * 3 * 2
L0 = 30
5) On commence la "quête" et "enquête" avec x = 0 : chaque nombre récupéré sera Q0, Q1, ..., Qx.
N0 = N
N0 = 7
5a) On prend N1, le Nb1er suivant notre Nb1er N0.
N1 = 11
5b) On calcule Qx = N1 - N0 (gap)
Q(0) = 11 - 7
Q(0) = 4
5c) On calcule Sq la somme des Qx
Sq = Q(0)
Sq = 4
5d) Sq = > L0 ?
4 > 30 ?
5f) Non, on translate N0 = N1...
N0 = 11
rebelote...
5a) On prend N1, le Nb1er suivant notre Nb1er N0.
N1 = 13
5b) On calcule Qx = N1 - N0 (gap)
Q(1) = 13 - 11
Q(1) = 2
5c) On calcule Sq la somme des Qx
Sq = Q(0) + Q(1)
Sq = 4 + 2
Sq = 6
5d) Sq= > L0 ?
6 > 30 ?
5f) Non, on translate N0 = N1...
N0 = 13
rebelote...
N1 = 17
Q(2) = 17 - 13 = 4
Sq = Q(0) + Q(1) + Q(2)
Sq = 4 + 2 + 4
rebolote...
(j'abrège)
Sq = 4 +2+4+2+4+6+2+6
Sq = 30
On quitte la boucle avec notre séquence Q(x)
6) Transfert AVX
Code : Tout sélectionner
4 2 4 2 4 6 2 6
*
7 7 7 7 7 7 7 7
=
28 14 28 14 28 42 14 42
+ (+ N * N)
49 49 49 49 49 49 49 49
=
77 63 77 63 77 91 63 91
Ça c'est notre crible donc transfert pour l'avancement de la cible dans le crible.
On fait pareil avec les autre 1ers jusqu'à "plus soif".
Ex avec 11
Code : Tout sélectionner
4 2 4 2 4 6 2 6
*
11 11 11 11 11 11 11 11
=
44 22 44 22 44 66 22 66
+ (+ N * N)
121 121 121 121 121 121 121 121
=
165 143 165 143 165 187 143 187