Parallelisation [JAVA] - Java - Programmation
Marsh Posté le 23-11-2004 à 12:36:53
Je ne suis pas sur que la machine virtuelle java puisse te permettre de prendre en compte le nombre de processeur.
Par contre faire du multithead en java est relativement facile, c 'est prévu à la base.
En revanche je me demande si c'est réèlement efficace. Messieurs les spécialistes votre avis ?
Marsh Posté le 23-11-2004 à 12:49:14
L'usage veut que l'on demande à l'utilisateur de définir le nombre de tâches, ou bien que l'on utilise un nombre qui semble logique (4 si tu as 4 tableaux, etc.). En effet, peut-être que l'utilisateur souhaite laisser un CPU libre, ou peut-être que chaque tâche n'utilise que 70% d'un CPU, car elle bloque sur le GC ou autres ?
En plus, en fonction de ta JVM et de ton OS, le mapping tache->lwp->cpu sera fait de façon différente:
http://java.sun.com/docs/hotspot/threads/threads.html
http://java.sun.com/j2se/1.5.0/doc [...] ities.html
Bref, il vaut mieux laisser l'utilisateur faire ça, et laisser l'OS optimiser la répartition. Pour ce qui est du fonctionnement de l'API des Threads, tu peux lire n'importe quel bon bouquin de Java, ça fait partie des bases du langage...
Marsh Posté le 23-11-2004 à 13:29:57
Oui, je sais comment lancer un thread.
Là, la question était plus de savoir comment gérer cela efficacement, en fonction du nombre de CPU. Parce que lorsque tu fais du calcul, qui utilise 100% CPU, lancer plusieurs threads ne sert à rien. Par contre, si tu as 2 processeurs, il peut etre intéressant de lancer explicitement un thread sur chaque processeur et ainsi (overhead exclu),calculer 2x plus vite.
Marsh Posté le 23-11-2004 à 13:35:06
oui mais ce qu'il me semble qu'on te dit c'est que justement, le developpeurs n'a pas le controle sur l' *endroit* (cpu) ou sont lancés les threads.
enfin je suppose que c'est expliqué dans les liens filé par lam's (mon idole)
Marsh Posté le 23-11-2004 à 14:14:26
the real moins moins a écrit : enfin je suppose que c'est expliqué dans les liens filé par lam's |
Ouais, mais les images sont peut-être trop petites. Je sais pas...
Marsh Posté le 23-11-2004 à 16:27:29
Plein de choses intéressantes dans les liens donnés, mais pas directement (à moins que je ne sois passé à coté de qqch) sur ce qui me concerne.
Pour parler clairement, disons que j'ai une boucle for, de 1 à n. Et que chaque opération pourrait etre exectué de manière indépendante.
J'aimer donc executer mon code non parallelisable, lire le nombre p de CPU, et lancer p Thread. Puis, retourner dans une éxecution séquentielle.
Sauf que généralement, pour définir un thread, il faut définir ce que l'on veut executer. Or là, l'execution dépend directement du nombre de cpu.
Style si 1 cpu alors for i de 0 à n-1
Si 2 cpu, alors boucle 1: for i de 0 à n/2 et boucle 2: for i de n/2 + 1 à n-1.
etc...
Je ne cherche pas à gérer mes threads, ou changer la priorité. Je cherche juste à aider la machine virtuelle à identifier les parties qu'il peut executer en parallele. Ensuite, je le laisse faire...
Et je ne peux rien créer en statique, parce que ce code peut tourner aussi bien sur mon portable (mono-proc) que sur un gros server (multi-proc).
Voilà. en espérant avoir été plus clair.
D'avance merci
Marsh Posté le 23-11-2004 à 16:29:12
euh un parametre passé en command line au lancement de ton machin?
Marsh Posté le 23-11-2004 à 16:30:53
sinon, une petite lecture de javadoc peut etre?
http://java.sun.com/j2se/1.4.2/doc [...] ocessors()
ça vaut bien la peine de faire des patés si c'est juste ça que tu veux.
Marsh Posté le 23-11-2004 à 16:35:06
OK, ma réponse est sans doute peu claire.
Utilise une valeur par défaut (4 par exemple), sachant que tous les CPUs sont capables de faire tourner plusieurs threads en même temps sans pénalités de performances.
D'autre part, cette valeur doit pouvoir être modifiée lors de l'exécution (par une propriété dans un fichier xml, ou bien en passant une valeur en argument à ton appli).
Au final, connaitre le nombre de CPU ne te donnerait pas beaucoup d'infos, parce qu'il n'y a strictement aucune garantie que chaque thread s'exécutera sur un CPU différent.
Marsh Posté le 23-11-2004 à 17:33:54
the real moins moins a écrit : sinon, une petite lecture de javadoc peut etre? |
N'ayant rien trouvé sur google, ni dans une recherche rapide dans la doc (je peux pas tout lire), je suis venu poser la question. C'est ce que je cherchais. Le fait désormais que l'on ne puisse pas assigner un process ou un thread à un processeur limite du coup l'intéret de la chose. Sauf le fait que si le nombre de processeur est plus grand que 1, alors cela vaut la peine de lancer des process/thread.
Marsh Posté le 23-11-2004 à 17:36:02
korben a écrit : le fait que si le nombre de processeur est plus grand que 1, alors cela vaut la peine de lancer des process/thread. |
Et si ton Pentium 4 utilise de l'HyperThreading, 1 CPU peut faire tourner plusieurs threads en même temps...
Marsh Posté le 23-11-2004 à 17:39:57
Lam's a écrit : Et si ton Pentium 4 utilise de l'HyperThreading, 1 CPU peut faire tourner plusieurs threads en même temps... |
:-)... on est d'accord. Mais tu as très bien compris ce que je voulais dire. Ceci-dit, je serais curieux de savoir justement ce que retourne la fonction java... 1 ou 2 avec de l'hyperthreading.
Marsh Posté le 23-11-2004 à 18:03:38
korben a écrit : :-)... on est d'accord. Mais tu as très bien compris ce que je voulais dire. Ceci-dit, je serais curieux de savoir justement ce que retourne la fonction java... 1 ou 2 avec de l'hyperthreading. |
à priori windows affiche deux processeurs "logiques" avec un P4 HT, donc je pense que java donne 2 aussi.
Marsh Posté le 23-11-2004 à 18:26:17
schnapsmann a écrit : à priori windows affiche deux processeurs "logiques" avec un P4 HT, donc je pense que java donne 2 aussi. |
Je pense aussi.
Marsh Posté le 20-01-2005 à 09:30:01
pour la petite histoire, je confirme que Runtime.getRuntime().availableProcessors() retourne bien 2 sur un HT.
Très instructif ce topic
Marsh Posté le 23-11-2004 à 12:10:41
Hello
J'ai un algorithme pouvant être executé en parallele.
Je souhaite le faire, dans un premier temps, sur des machines multiprocesseur (et non pas par réseau, style MPI).
J'ai vague souvenir qu'il était possible de récupérer le nombre n de processeur d'une station et donc de lancer n Threads.
Qqn peut-il m'en dire plus? Comment faire pour garder un code le plus lisible possible et fonctionnant également sur une station mono-processeur.
Si qqn a des conseils ou un bon lien... je suis preneur.
De meme que si vous avez des conseils pour de l'optimisation de code, pour du calcul numerique, sous java (il n'y a donc aucun accès à une base de donnée, aucune interface graphique api ou je ne sais quoi, juste du calcul et un system.out.print).
D'avance merci