Les nombres premiers d'Eratosthène plus rapidement de manière séquentielle que simultanée
Voulez-vous générer efficacement des nombres premiers à l'aide du tamis d'Eratosthène ? Étonnamment, une mise en œuvre séquentielle peut être beaucoup plus rapide qu’une mise en œuvre simultanée. Cet article explorera les goulots d'étranglement potentiels dans la version concurrente et fournira quelques conseils pour optimiser les implémentations séquentielles et simultanées.
Implémentation séquentielle
L'implémentation séquentielle du tamis de Eratosthène est simple :
- Initialisez un tableau de booléens à true pour toutes les valeurs jusqu'au nombre maximum.
- Parcourez les nombres de 2 à la racine carrée du nombre maximum.
- Pour chaque nombre p, rayez tous les multiples de p en définissant les valeurs correspondantes dans le tableau booléen sur faux.
- Imprimez les nombres restants qui sont toujours définis sur vrai.
Cette approche est relativement efficace, avec une complexité temporelle de O(n log log n).
Implémentation simultanée
L'implémentation simultanée vise à paralléliser la boucle externe, où nous parcourons les nombres de 2 à la racine carrée du nombre maximum. Vous pouvez diviser la plage en plusieurs sous-plages plus petites et attribuer chaque sous-plage à un thread différent. Chaque thread peut ensuite rayer indépendamment les multiples de p dans sa sous-plage.
Glots d'étranglement potentiels dans la mise en œuvre simultanée
Il existe plusieurs goulots d'étranglement potentiels dans la mise en œuvre simultanée :
-
Surcharge de synchronisation des threads : chaque thread doit accéder et modifier le tableau booléen partagé. Cela nécessite des primitives de synchronisation (par exemple, des verrous ou des opérations atomiques) pour garantir que plusieurs threads ne tentent pas de modifier le même élément simultanément. La synchronisation peut introduire une surcharge importante, surtout si le tableau est grand.
-
Faux partage : les threads peuvent être attribués à des sous-plages du tableau qui sont proches les unes des autres en mémoire. Cela peut conduire à un faux partage, où différents threads accèdent involontairement à la même ligne de cache, réduisant ainsi les performances.
-
Parallélisme limité : Le niveau de parallélisme est limité par le nombre de processeurs disponibles. Si le nombre maximum n'est pas beaucoup plus grand que le nombre de processeurs, les avantages de la parallélisation peuvent être minimes.
Conseils d'optimisation
Pour optimiser les deux séquences et implémentations simultanées, tenez compte des conseils suivants :
-
Utilisez une structure de données spécialisée : Au lieu d'utiliser un tableau booléen, utilisez un jeu de bits ou une structure de données à tamis premier spécialement conçue pour une génération efficace de nombres premiers.
- Optimiser le contrôle de boucle : Dans l'implémentation séquentielle, envisagez d'utiliser un tamis d'Eratosthène modifié qui marque uniquement les nombres divisibles par des facteurs premiers du compteur de boucles p.
-
Réduire les frais généraux de synchronisation : dans la mise en œuvre simultanée, utilisez des techniques de synchronisation fines telles que des algorithmes sans verrouillage ou des opérations atomiques pour minimiser les frais généraux liés à l'accès aux données partagées.
-
Réduire les faux partages : complétez le tableau booléen avec de la mémoire supplémentaire pour garantir que les sous-plages affectées aux différents threads sont stocké dans des lignes de cache distinctes.
-
Augmenter le parallélisme : explorez les méthodes pour augmenter le niveau de parallélisme, comme l'utilisation de plusieurs processeurs ou l'utilisation d'un pool de threads avec un plus grand nombre de threads.
Conclusion
Bien qu'une implémentation simultanée du Sieve of Eratosthène peut potentiellement accélérer la génération de nombres premiers, mais ce n'est pas toujours plus rapide qu'une implémentation séquentielle en raison de goulots d'étranglement potentiels. En traitant soigneusement ces goulots d'étranglement et en employant des techniques d'optimisation, vous pouvez améliorer les performances des implémentations séquentielles et simultanées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn