Je sais que la première découverte est bien étudiée, et il y a beaucoup de différentes implémentations. Ma question est, en utilisant la méthode fournie (exemple de code), comment puis-je faire pour briser le travail? La machine sur laquelle il fonctionnera aura 4 processeurs hyperthreadés quad core et 16Go de RAM. Je me rends compte qu'il y a quelques améliorations qui pourraient être faites, en particulier dans la méthode IsPrime
. Je sais aussi que des problèmes surviendront lorsque la liste contient plus de int.MaxValue
éléments. Je me fiche de toutes ces améliorations. La seule chose qui m'importe est de savoir comment casser le travail.Comment puis-je faire fonctionner ce premier chercheur en parallèle?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Prime
{
class Program
{
static List<ulong> primes = new List<ulong>() { 2 };
static void Main(string[] args)
{
ulong reportValue = 10;
for (ulong possible = 3; possible <= ulong.MaxValue; possible += 2)
{
if (possible > reportValue)
{
Console.WriteLine(String.Format("\nThere are {0} primes less than {1}.", primes.Count, reportValue));
try
{
checked
{
reportValue *= 10;
}
}
catch (OverflowException)
{
reportValue = ulong.MaxValue;
}
}
if (IsPrime(possible))
{
primes.Add(possible);
Console.Write("\r" + possible);
}
}
Console.WriteLine(primes[primes.Count - 1]);
Console.ReadLine();
}
static bool IsPrime(ulong value)
{
foreach (ulong prime in primes)
{
if (value % prime == 0) return false;
if (prime * prime > value) break;
}
return true;
}
}
}
Il y a 2 régimes de base que je vois: 1) à l'aide de toutes les discussions pour tester un seul numéro, ce qui est probablement idéal pour les nombres premiers plus élevés mais je ne peux pas vraiment penser à la façon de la mettre en œuvre, ou 2) en utilisant chaque fil pour tester un seul nombre premier possible, ce qui peut provoquer la découverte d'une chaîne non continue de nombres premiers et l'exécution de problèmes de ressources inutilisées lorsque le nombre suivant à tester est supérieur au carré du nombre premier le plus élevé trouvé.
Pour moi, il semble que ces deux situations sont difficiles seulement dans les premiers stades de la construction de la liste des nombres premiers, mais je ne suis pas entièrement sûr. Ceci est fait pour un exercice personnel de briser ce genre de travail.
"Il ne vaut pas la peine de paralléliser, sauf si vous utilisez un bon algorithme en premier lieu." la question vous demande spécifiquement de paralléliser cette implémentation, pas un autre algorithme de premier ordre. Si cet algorithme répond à une mesure arbitraire de la valeur n'a rien à voir avec la façon de le paralléliser. –