Question

Je viens d'implémenter un tout premier Jobquee multithread simple en C ++ et j'ai pensé (et lu) que c'est une bonne idée d'utiliser un fil de travail pour chaque thread matériel (dans mon cas, ce serait 4). Fondamentalement, mon application charge beaucoup d'images (en même temps) sur Internet en ce moment, et je remarque que j'obtiens une vitesse énorme si j'augmente le nombre de fils de travail à 8 ou même 16 au lieu de 4.

Existe-t-il une règle générale du nombre de threads à utiliser dans une telle travail? Je suppose que 4 serait un grand nombre si je créais de nouveaux emplois à chaque trame, et les threads des travailleurs avaient une charge de travail constante à chaque cadre, tandis que si je veux traiter beaucoup de choses à la fois (comme charger 50 images environ) Plus de fils que cela peut donner une grande vitesse. Pourtant, y a-t-il une règle de base pour le bon numéro dans différents scénarios?

Merci

Était-ce utile?

La solution

Le nombre idéal de threads de travail est égal au nombre de cœurs de processeur dans le système. Cependant, en réalité, cela est sous-optimal car parfois les tâches peuvent bloquer sur le réseau, les E / S de disque, etc. entraînant une sous-utilisation. Cela ressemble à ce qui se passe ici.

Souvent, les piscines de fil "dépassent le calendrier" pour compenser cela. Parfois, il y a une prise en charge du noyau intégrée pour vous notifier lorsque les threads bloquent, vous savez donc en faire tourner un autre (ports d'achèvement dans Win32) et toujours appuyer sur le nombre optimal de threads de travailleurs actifs.

Autres conseils

Microsoft a choisi de fournir une implémentation Threadpool (disponible à partir du système d'exploitation, et également disponible en .NET) avec le nombre de threads commençant à 1,5 fois le nombre de processeurs. L'idée est qu'un fil qui bloque (pour les E / S de disque, etc.) peut échanger contre un autre fil qui n'est pas bloqué. Le threadpool est également configurable afin que vous puissiez exiger un nombre minimum de threads, si vous décidez que le fait d'avoir des threads 2x, 3x ou plus est nécessaire.

Je soupçonne que tout cela s'applique à votre situation.

Il y a quelque temps, je cherchais la réponse de cette question et je suis tombé sur un article MSDN qui indiquait qu'il était préférable d'utiliser Max 16 Thread par Core. Malheureusement, je ne trouve plus l'article, mais pour charger des images, 16 threads par noyau ont un sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top