2017-05-11 1 views
3

Mon CPU est 8x2600 MHz (Intel Xeon CPU E5-2670 0 @ 2.60GHz).
J'ai un algorithme de traitement de données qui peut s'exécuter en parallèle écrit en Java. Cette fonction détermine le nombre de threads simultanés pendant l'exécution avec Runtime.getRuntime().availableProcessors() qui renvoie 8.Comment déterminer le nombre optimal de threads Java lors de l'utilisation d'un CPU multi-cœur hyperthreadé

Cet algorithme est 100% non bloquant. La CPU supporte l'hyper-threading avec 2 threads par core.

Maintenant, devrais-je exécuter l'algorithme avec 8 threads parce que Java ne voit que 8 cœurs, ou devrais-je utiliser 16 threads Java en tenant compte de l'hyper-threading fourni par le CPU?

+0

Pour plus de 8 meilleurs à faire quelques tests de performance, y compris les cas de bord. – didiz

+1

Le bénéfice ne repose pas uniquement sur le nombre de cœurs. Si nous parlons pour un seul noyau. Le système d'exploitation va donner la main à un thread pour une petite quantité de temps, votre application n'est pas la seule à demander l'heure, donc si vous avez plus d'un thread, vous aurez la main plus souvent puisque votre application aura plus probabilité d'avoir la main. Ce n'est pas exactement pourquoi, la logique est que c'est complexe mais vous aurez l'idée. (En français, on appelle ça "l'ordonnanceur", mais je ne trouve pas de traduction ....) – AxelH

+0

Tu as vraiment besoin de savoir? Ne pourriez-vous pas simplement créer un CachedThreadPool et laisser le reste à son implémentation? – maraca

Répondre

1

Le nombre idéal de threads dépend de la tâche elle-même. Le changement de contexte dans les CPU modernes peut être quelque peu coûteux en raison du fait que les données utilisées dans le calcul sont fortement mises en cache. Considérez la situation où il n'y a pas d'activités liées à l'E/S et où les cycles du processeur n'ont pas besoin d'être gaspillés en attente. Ensuite, le débit maximal serait atteint en ayant n_threads = n_cores. La commutation de contexte peut être coûteuse même lorsque l'hyper-threading est disponible. Mais s'il existe des activités d'E/S, l'augmentation du nombre de threads au-delà du nombre de cœurs peut en bénéficier.