3 votes

Comment déterminer le nombre optimal de threads en cours d'exécution pour une tâche liée au processeur ?

Je suis en train d'implémenter un programme qui normalise un grand ensemble de données (un seul fichier), c'est un calcul mathématique intensif et donc limité par le CPU.

Après avoir consulté certaines des questions des fils optimaux, la plupart d'entre elles aboutissent à ceci :

Runtime.getRuntime().availableProcessors()

Mais avec la technologie HT, un seul cœur peut gérer deux threads simultanément.

Certaines des réponses précédentes indiquent également que le nombre optimal de threads = nombre de cœurs Je ne suis pas sûr que cela soit correct pour les tâches limitées par le CPU.

Sachant que chaque système d'exploitation peut exécuter la programmation parallèle différemment, dois-je utiliser uniquement le logiciel availableProcessors() sans avoir à prendre en compte des éléments tels que

  • Thread(s) par cœur
  • cœur(s) par socket
  • Socle(s) de l'unité centrale

Par exemple, dois-je utiliser availableProcessors() * Thread(s) par cœur pour obtenir des fils optimaux ? Cela crée-t-il une concurrence entre les fils ?

Je cherche la pratique recommandée pour y parvenir, sans avoir à modifier et reconstruire le programme lorsque celui-ci est transféré sur l'autre machine (le programme n'est testé que sur une machine locale).

Merci d'avance.

2voto

Si vous essayez de trouver un nombre optimal de threads pour une tâche non bloquante liée à l'unité centrale.

Javadoc pour availableProcessors() :

public int availableProcessors()
Returns the number of processors available to the Java virtual machine.
This value may change during a particular invocation of the virtual machine. Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately.

Returns:
the maximum number of processors available to the virtual machine; never smaller than one
Since:
1.4

Veuillez noter que la ligne - Returns the number of processors available to the Java virtual machine.

Étant donné que la JVM se situe entre le système d'exploitation et le programme Java, elle ne renvoie pas le nombre de processeurs physiques, mais le nombre de processeurs logiques de la JVM (la coordination entre les processeurs logiques et les processeurs physiques dépend de la JVM et du système d'exploitation dans lequel la JVM est exécutée).

Par conséquent, si vous avez

  • 1 Socle de l'unité centrale
  • 4 Cœurs par sockets
  • 2 Threads par cœur

les availableProcessors() doit renvoyer un entier inférieur ou égal à 8 dépend de l'environnement d'exécution. Autre exemple :

  • 2 Sockets CPU
  • 4 Cœurs par sockets
  • 2 Threads par cœur

Ceci renverra un entier inférieur ou égal à 16 dépend de l'environnement d'exécution.

C'est pourquoi le nombre de threads optimaux doit être égal au nombre de availableProcessors() . Cependant, pour obtenir le nombre optimal de threads, il est préférable d'effectuer un test dans l'environnement. Puisque vous souhaitez éviter la complication d'une reconstruction, la meilleure chose à faire est peut-être de suivre les instructions de la Javadoc.

C'est également indiqué dans la Javadoc : Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately. .

Interrogez cette propriété si vous souhaitez réduire la charge de travail liée à la recherche de fils.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X