10
votes

Utilisation de la filetage sur la vitesse de quad haut en place du code 65%?

Cet exemple Code compare la méthode de série avec la méthode filetée, sur le processeur quadrial . Le code utilise simplement GetPixel () pour lire tous les pixels de 4 images. J'ai constaté que l'accélération est d'environ 65%, pourquoi cela ne correspond pas à 75% car j'ai 4 cœurs et tous sont entièrement utilisés?

P.s:

Pouvez-vous vérifier le code comme je ne fais pas d'E / S, et aucun autre processus ne fonctionne sur les machines (processus Windows normaux)


1 commentaires

Beaucoup de bélier se touchent, les processeurs commenceront à se battre dans le bus.


6 Réponses :


4
votes

Cela pourrait être un nombre quelconque de choses. Un couple qui vient à l'esprit

  1. Front-hauteur de l'administration des différents threads.
  2. D'autres processus utilisent des ressources dans le système en même temps.

2 commentaires

Je suis sûr qu'il n'y a pas d'autres processus utilisent fortement des processeurs


Il reste encore une possibilité forte que l'administration du fil provoque la baisse des performances attendues.



2
votes

Très probablement, il doit concurrencer les autres threads sur une structure de données ou un fichier, de sorte que vous n'obtenez pas une exécution parallèle à 100%.

Par exemple, si vous souhaitez exécuter un type de fonctionnement de téléchargement-webfage-de-website en parallèle à 4 voies sur un quad-core et que le serveur n'autorise que 1 téléchargement simultané de la même adresse IP à la fois, Vous n'obtiendrez pas de vitesse du tout.

En outre, il y a des frais généraux liés à la filature des threads et à les maintenir, de sorte que vous n'obtenez pas l'utilisation d'un noyau complet lorsque vous commencez à faire parallèlement, bien que ce ne soit probablement pas un gros facteur dans ce cas.


0 commentaires


1
votes

Parce qu'il y a d'autres facteurs à considérer. Like Memory et E / S Bande passante / Conférence, contexte de thread basculant sur le dessus de la tête, etc.


0 commentaires

1
votes
  1. Vous l'exécutez dans un système d'exploitation. Il y a d'autres processus en cours d'exécution. Celles-ci utiliseront une partie de l'heure du processeur.
  2. Peut-être que vous n'êtes plus cpu-Limited mais io-Limited (bande passante mémoire, bande passante de disque, ...).
  3. Il y aura toujours des frais généraux pour le filetage (et la commutation thread), le marshalling, etc.

    Globalement, de mon expérience de programmation parallèle, si vous obtenez une période écoulée de 65% de moins, c'est plutôt bon.


0 commentaires

2
votes

Le filetage a des frais généraux et tout ne peut toujours pas fonctionner en parallèle.

  • temps pour créer / démarrer / arrêter les threads.
  • Travail supplémentaire effectué (comme Verrouillage / incrémentation)
  • Toutes les ressources ne peuvent être parfaitement parallélisables, par ex. Accès à la mémoire ou fichiers de lecture / d'écriture.
  • Le système d'exploitation et d'autres applications peut avoir besoin d'une partie du temps de processeur de temps en temps.

0 commentaires