Bonjour,
ben tout est dans le titre.
Même si je n'y crois pas trop, je me demandais s'il y avait un moyen d'utiliser les commandes SSE 2 ou 3 (mieux) en java ?
Merci par avance.
Version imprimable
Bonjour,
ben tout est dans le titre.
Même si je n'y crois pas trop, je me demandais s'il y avait un moyen d'utiliser les commandes SSE 2 ou 3 (mieux) en java ?
Merci par avance.
java tourne sur une machne virtuelle avec son propre jeu d'instruction. C'est le role de l'implémentation de la machine virtuelle en question d'utiliser à bon essicent ce que le CPU hôte founis comme possibilités.
Mmm... ok, c'est logique.
Mais est ce que l'on ne peut pas forcer certaines accélérations/fonctions.
Nous faisons actuellement certains tests C++ vs Java pour différents algorithmes de traitement d'images.
Les performances indiquent clairement que la JVM je passe absolument pas par ces instructions :cry:, sauf si l'écart de performance avec C++ est désormais un coefficient fois 4 ou plus.
tu ne peux pas. Même si tu faisait un code optimisé en java pur pour du SSE, quelles seraient les performances de ton algorithme une fois qu'il sera lancé sur un ARM, ou une machine AMD64?
La première chose à faire estde vous assurer que vous n'êtes plus en interprété pour faire vos mesures. Pour ça, il existe (je les retrouve plus:aie:) des paramètres à filer à la JMV pour qu'elle affiche dans la console les méthode qu'elle compile à la volée en code natif. On peux avoir de très grosse différence de perf entre une code java interprété et un code java natif.
Seulement, le JIT il compile pas tout en natifs, c'est pour ça qu'on doit en général faire une procédure où le calcul est fait un certain nombre de fois jusque stabilisation du temps mesuré.
ok, pour voir ce qui est compilé nativement, rajouter ce paramètre à l'exécution
exempleCode:-XX:+PrintCompilation
Code:java -XX:+PrintCompilation -jar mon.jar
Voilà ce que j'obtiens, mais j'avoue ne pas savoir l'interpréter :-(
Citation:
1 java.lang.String::hashCode (64 bytes)
2 java.lang.String::charAt (33 bytes)
3 sun.nio.cs.UTF_8$Decoder::decodeArrayLoop (553 bytes)
4 java.math.BigInteger::mulAdd (81 bytes)
5 java.math.BigInteger::multiplyToLen (219 bytes)
6 java.math.BigInteger::addOne (77 bytes)
7 java.math.BigInteger::squareToLen (172 bytes)
8 java.math.BigInteger::primitiveLeftShift (79 bytes)
9 java.math.BigInteger::montReduce (99 bytes)
10 sun.security.provider.SHA::implCompress (491 bytes)
11 sun.nio.cs.UTF_8$Encoder::encodeArrayLoop (490 bytes)
12 java.lang.String::indexOf (151 bytes)
Reading image 'ImagesNdg/Einstein.pgm' 13 java.lang.String::indexOf (166 bytes)
(256x256 <=> 65536 pixels, 8 bits BYTE_GRAY)... 14 java.util.Properties$LineReader::readLine (452 bytes)
15 java.awt.image.BufferedImage::getWidth (8 bytes)
17 sun.awt.image.SunWritableRaster::notifyWrite (17 bytes)
16 sun.awt.image.ByteInterleavedRaster::setSample (163 bytes)
1% imageTiTi.PgmTools::Read @ 163 (224 bytes)
successfully.
18 java.lang.Object::<init> (1 bytes)
19 java.io.UnixFileSystem::normalize (75 bytes)
20 java.lang.String::equals (88 bytes)
21 java.lang.String::lastIndexOf (156 bytes)
22 java.lang.CharacterDataLatin1::getProperties (11 bytes)
23 java.lang.String::lastIndexOf (151 bytes)
24 java.util.Properties::loadConvert (505 bytes)
25 java.lang.String::startsWith (78 bytes)
3 made not entrant sun.nio.cs.UTF_8$Decoder::decodeArrayLoop (553 bytes)
11 made not entrant sun.nio.cs.UTF_8$Encoder::encodeArrayLoop (490 bytes)
--- n java.lang.System::arraycopy (static)
26 java.lang.Character::toLowerCase (162 bytes)
27 java.lang.CharacterDataLatin1::toLowerCase (36 bytes)
28 java.lang.String::toLowerCase (436 bytes)
29 ij.macro.Program::lookupWord (57 bytes)
2% sun.nio.cs.UTF_8$Encoder::encodeArrayLoop @ 73 (490 bytes)
30 sun.nio.cs.UTF_8$Encoder::encodeArrayLoop (490 bytes)
31 java.util.Arrays::binarySearch0 (95 bytes)
32 sun.net.www.ParseUtil::encodePath (336 bytes)
33 java.lang.Math::max (11 bytes)
3% ! morphee.fastMorpheeNew.DilateSegmentHorizontalFM$DilateSegmentHorizontal2Thread::run @ 796 (2425 bytes)
34 utils.arrays.ArraysOperations::SetConstant (19 bytes)
4% ! morphee.fastMorpheeNew.DilateSegmentHorizontalHisto$DilateSegmentHorizontalHistoThread::run @ 628 (2062 bytes)
5% ! morphee.fastMorpheeNew.DilateSegmentHorizontalHisto$DilateSegmentHorizontalHistoThread::run @ 712 (2062 bytes)
time 1 = 1.164
time 2 = 1.399
35 sun.awt.image.ByteInterleavedRaster::getSample (133 bytes)
36 sun.awt.image.SunWritableRaster::notifyRead (17 bytes)
6% imageTiTi.ImageTools::areEqual @ 133 (202 bytes)
Toutes les lignes précédées d'un chiffre sont des méthode compilées nativement. Les méthodes avec un % indiquent le tau d'utilisation de ces méthode. C'est là dessus que le JIT détermine les classes qu'il compile.
Mouai... on dirait donc qu'il n'y a pas grand chose à faire pour moi :-(
comme toujours en java, lancer un profiler, déterminer les points chauds pour les améliorer.
En parlant de profiler, quels sont ceux performants en Java ?
Est ce qu'il y en a qui peuvent être directement dans Eclipse ?
il y a des profiler intégrés à eclipse et netbeans (me souviens plus de leur nom), c'est suffisant pour déterminer les points chauds de votre programme.