Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1893 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Parallelisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JAVA] Parallelisation

n°905382
korben
Posté le 23-11-2004 à 12:10:41  profilanswer
 

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

mood
Publicité
Posté le 23-11-2004 à 12:10:41  profilanswer
 

n°905403
gedeon
Posté le 23-11-2004 à 12:36:53  profilanswer
 

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 ?

n°905416
Lam's
Profil: bas.
Posté le 23-11-2004 à 12:49:14  profilanswer
 

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...
 

n°905469
korben
Posté le 23-11-2004 à 13:29:57  profilanswer
 

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.

n°905475
the real m​oins moins
Posté le 23-11-2004 à 13:35:06  profilanswer
 

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)

n°905533
Lam's
Profil: bas.
Posté le 23-11-2004 à 14:14:26  profilanswer
 

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...
 
http://java.sun.com/docs/hotspot/threads/threadModel.gif

n°905652
Joel F
Real men use unique_ptr
Posté le 23-11-2004 à 15:11:51  profilanswer
 

ca vaut quoi le MP en JAVA ??

n°905751
korben
Posté le 23-11-2004 à 16:27:29  profilanswer
 

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

n°905754
the real m​oins moins
Posté le 23-11-2004 à 16:29:12  profilanswer
 

euh un parametre passé en command line au lancement de ton machin? [:mlc]

n°905756
the real m​oins moins
Posté le 23-11-2004 à 16:30:53  profilanswer
 

sinon, une petite lecture de javadoc peut etre? [:kiki]
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.

mood
Publicité
Posté le 23-11-2004 à 16:30:53  profilanswer
 

n°905762
Lam's
Profil: bas.
Posté le 23-11-2004 à 16:35:06  profilanswer
 

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.


Message édité par Lam's le 23-11-2004 à 16:35:52
n°905851
korben
Posté le 23-11-2004 à 17:33:54  profilanswer
 

the real moins moins a écrit :

sinon, une petite lecture de javadoc peut etre? [:kiki]
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.


 
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.

n°905854
Lam's
Profil: bas.
Posté le 23-11-2004 à 17:36:02  profilanswer
 

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...

n°905860
korben
Posté le 23-11-2004 à 17:39:57  profilanswer
 

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.

n°905888
schnapsman​n
Zaford Beeblefect
Posté le 23-11-2004 à 18:03:38  profilanswer
 

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.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°905903
korben
Posté le 23-11-2004 à 18:26:17  profilanswer
 

schnapsmann a écrit :

à priori windows affiche deux processeurs "logiques" avec un P4 HT, donc je pense que java donne 2 aussi.


 
Je pense aussi.

n°957123
bobuse
Posté le 20-01-2005 à 09:30:01  profilanswer
 

pour la petite histoire, je confirme que Runtime.getRuntime().availableProcessors() retourne bien 2 sur un HT.
 
Très instructif ce topic :)


---------------
get amaroK plugin

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Parallelisation

 

Sujets relatifs
[JAVA ]Impression automatique avec paramètres spéciaux[Java]Importer un jar dans un autre...
[JAVA Socket] ou comment detecter qd un client s'est deconnecté?[JAVA] (débutant) Copier un tableau à deux dimensions
[MySQL/JAVA]pb avec driver ODBCjava, truetype et anti-aliasing
[java] un random avec une valeur int[java] comment faire en sorte que un Jtextarea
[java] telecharger n'importe qu'elle fichierprobleme java et debian
Plus de sujets relatifs à : [JAVA] Parallelisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR