Ta propre compilation avec GCC sous MacOS est assez plus rapide que la mienne avec GCC sous Windows...
Version imprimable
Ta propre compilation avec GCC sous MacOS est assez plus rapide que la mienne avec GCC sous Windows...
n'oublie pas que j'execute tes programmes sous une machine virtuelle.
sinon tu as raison, le windows sur VMware ne prend pas en compte le 2ieme core, ce qui n'est pas normale, mais celui-ci est une image de mon ancien PC ce qui peut expliquer pourquoi ... mais je suis en train de chercher ...
C'est quoi exactement une machine virtuelle? C'est un programme sous MacOS qui "boote" sur Windows? Y'a plusieurs années j'avais fait une 2ème partition pour Linux, mais vu le peu d'utilisation que j'en faisais, je l'ai supprimé...
Si le problème n'est pas dû à mon programme, ça me rassure d'un certain coté. Désolé que tu doivent plancher sur VMware.
Est-ce comme si t'avais 2 machines différentes, un core pour chaque? Comment tu t'en rends compte que VMware ne reconnaît pas le 2ème core? Dans le gestionnaire de tâche?
C'est quand même bizarre que mon programme ne reconnaisse pas le 2ème coeur parce que je n'appelle pas de fonctions de l'API Windows, mais uniquement l'instruction CPUID du processeur. On dirait que la machine virtuelle modifie le comportement propre du processeur.
en fait j'utilise une image de l'ordi que j'avais avant, un centrino.
et en fait d'apres le lien : http://support.microsoft.com/kb/315341/
je suis foutu :-/ windows detecte cela ä l'installation donc je suis obligé de reinstaller une machine virtuelle si je veux exploiter mes deux cores :-/
VMware permet de faire tourner windows (ou linux ou ...) en paralle de macosx. C'est un virtualiseur... donc ce n'est pas aussi rapide que l'installation en natif mais c'est beaucoup plus user-friendly de ne pas rebooter pour passer de l'un a l'autre, et la vitesse est tres acceptable. Un gros avantage est de pouvoir faire des snapshots dans des cas risqués et de pouvoir faire un rollback si cela ne va pas....
mais par contre ton programme le detecte bien :-)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 name Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz vendor GenuineIntel intel 1 amd 0 mmx 1 sse 1 sse2 1 sse3 1 3dnow 0 L1 cache 32768 L2 cache 4194304 processors 1 logical cores 2 physical cores 2
Visiblement y'avait donc un double problème:
- VMWare ne reconnaissant qu'un seul core
- Paramétrage de mon prog faisant, contrairement à ce que j'ai dit un peu plus haut, bien un appel à l'API Windows.
Tu trouveras les nouveaux exécutables qui ce basent sur l'instruction CPUID là:
http://www.ient.rwth-aachen.de/team/...gcc_vs_icl.zip
J'ignore si le multi-threading marchera pleinement sous VMware.
A la vue des résultats du bench que tu as compilé toi-même, je pense que tu as mal paramétré le multi-threading puisque les perfs correspondent à celles que j'attendrais de la part seul core.
Il y a 2 choses à définir dans 'genial_config.h':
- #define MAX_THREADS 0 (ou bien 2 pour éviter la détection automatique)
- #define BLAS_THREADING
Je pense que que tu as oublié la 2ème.
ci-joint le genial_config.h
tout est bien defini de mon point de vue ...
tu pourrais confirmer ?
a+
Ajoute ceci dans 'genial_config.h'
Visiblement je n'avais pas permis ce paramètre quand je t'ai fait faire la mise à jour pour le multi-threading de la multiplication matricielle.Code:
1
2
3 #ifndef BLAS_THREADING #define BLAS_THREADING #endif
Et sinon, les 2 cores marchent-ils sous VMware?
il y est déjà dans genial_config.h donc je pense que le resultat est bien avec 2 threads ... donc ca cloche pour le multi-thread ???
sinon pour VMWare mon windows ne reconnait pas les deux cores puisque j'ai fait une image d'une installation sur un PC ayant un centrino.
Pour achever les tests, il faut que j'installe une version sur mon mac pour que windows reconnaise et installe un kernel pour dual-cores.
J'ai relancer genial sur mon mac intel core duo, les resultats sont catastrophiques par rapport au core 2 duo...
alors je pense que ca vient de gcc car sous VMWare ton programme s'execute tellement plus vite. Ca me fait aussi penser que ce n'est pas une question de cache.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Benchmark GEMM 48 15 SSE2 MT2.txtfloat (4x4) 0 39.5144 38.8072 (8x8) 0 267.046 225.049 (16x16) 0 1183.7 664.314 (32x32) 0 2632.41 1041.96 (64x64) 0 2029.52 2480.93 (100x100) 0 1966 2200 (128x128) 0 2210.4 2260.73 (144x144) 0 2335.04 2311.15 (160x160) 0 2383.87 2220.03 (176x176) 0 2725.89 2104.39 (192x192) 0 2760.38 3085.96 (200x200) 0 2752 3104 (256x256) 0 2785.02 3355.44 (400x400) 0 2886.27 3513.73 (500x500) 0 2970.3 3605.77 (512x512) 0 2955.25 3579.14 (600x600) 0 2994.06 3738.46 (700x700) 0 2956.9 3708.11 (800x800) 0 3011.76 3723.64 (900x900) 0 2995.89 3770.69 (1000x1000) 0 3007.52 3773.58 (1024x1024) 0 2982.62 3734.75 (1500x1500) 0 3026.91 3813.56 (2000x2000) 0 3036.05 3836.93 (2048x2048) 0 3019.31 3826.25
ok j'ai testé ton bench sur un windows qui reconnait le dual-core, toujours avec VMWare ... ben y a pas photo :aie:
GCC Benchmark GEMM 48 15 SSE2 MT2
ICC Benchmark GEMM 48 15 SSE2 MT2Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 GENIAL sgemm ATLAS sgemm GENIAL dgemm ATLAS dgemm 4 167 -1 247 -1 8 1154 -1 1242 -1 16 3556 -1 2648 -1 32 7986 -1 3361 -1 64 7709 -1 4210 -1 100 7704 -1 6729 -1 128 11447 -1 6736 -1 144 12120 -1 7060 -1 160 13332 -1 7466 -1 176 15147 -1 8325 -1 192 17085 -1 9135 -1 200 17261 -1 9255 -1 256 16860 -1 5951 -1 400 14502 -1 7567 -1 500 16010 -1 7991 -1 512 14709 -1 7934 -1 600 16941 -1 8512 -1 700 16897 -1 8232 -1 800 17504 -1 8192 -1 900 17496 -1 8863 -1 1000 18349 -1 8547 -1 1024 16207 -1 9177 -1 1500 18750 -1 9196 -1 2000 19680 -1 9395 -1 2048 19634 -1 9163 -1
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 GENIAL sgemm ATLAS sgemm GENIAL dgemm ATLAS dgemm 4 230 312 293 358 8 1548 1145 1317 1085 16 3828 1649 3301 1710 32 8786 2009 3974 1912 64 8250 1847 4974 2040 100 9714 7212 6833 3192 128 11632 4835 6963 2707 144 12385 4119 7002 4442 160 13493 11380 7345 3874 176 16060 9829 4169 3599 192 16875 8368 6694 3539 200 16788 7724 9379 3389 256 15461 10413 4606 2810 400 12611 9412 6429 2922 500 13547 9852 5708 3695 512 14546 9256 6129 3967 600 14897 9191 4256 3945 700 15662 8795 8757 3822 800 15398 10089 8192 4096 900 16444 9818 8477 4251 1000 16000 10667 9132 4000 1024 17180 10579 9138 4295 1500 18000 10800 9388 4319 2000 19324 11012 9569 4321 2048 18653 11105 9560 4416
et comment je fais sur Mac alors pour activer le multi-threads ?
peut-etre redonne moi les derniers sources avec toutes les options d'activées ... ?
Pourtant ça devrait marcher. :-/
Voici mes sources actuelles, tu peux écraser tous les fichiers.
Ainsi que la source du bench correspondant, à remplacer également car certains appels ont changé.
sinon c'est pas mal les perfs multi-thread sur le Core2Duo, pas mal du tout...
C'est vraiment un peu plus lent avec ICL qu'avec GCC, t'as pas interverti les résultats?
non je n'ai pas interverti ...
je viens de retester ...
mais ca colle pas du tout, c'est completement incoherent !!!
il y a forcement un probleme quelque part, ca peut pas s'executer plus lentement que sous une VM avec VMWare !!!!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 /usr/local/bin/g++ main.cpp -o gcc-genial -O2 -I../genial -msse3 -Winline -I/ATLAS/include/ -L/ATLAS/my_build_dir/lib/ -latlas -lcblas -I/ATLAS/my_build_dir/include/ -DNDEBUG -DBLAS_THREADING -DMAX_THREADS=2 Benchmark GEMM 48 15 SSE2 MT2.txt float (4x4) 14.471 51.5296 -1 (8x8) 126.756 370.365 -1 (16x16) 1006.85 2065.67 -1 (32x32) 8231.48 6685.33 -1 (64x64) 65971.9 4321.63 -1 (100x100) 249783 5419.05 -1 (128x128) 523642 6870.67 -1 (144x144) 745206 7820.43 -1 (160x160) 1.02516e+06 7782.4 -1 (176x176) 1.36635e+06 8359.39 -1 (192x192) 1.77349e+06 8897.92 -1 (200x200) 2.00454e+06 8720 -1 (256x256) 4.1994e+06 8947.85 -1 (400x400) 1.60115e+07 10240 -1 (500x500) 3.12032e+07 10714.3 -1 (512x512) 3.34894e+07 10737.4 -1 (600x600) 5.39865e+07 10800 -1 (700x700) 8.57452e+07 10976 -1 (800x800) 1.28045e+08 10971.4 -1 (900x900) 1.82375e+08 10800 -1 (1000x1000) 2.50336e+08 10810.8 -1 (1024x1024) 2.68791e+08 10226.1 -1 (1500x1500) 8.53325e+08 10887.1 -1 (2000x2000) 2.03484e+09 11034.5 -1 (2048x2048) 2.14745e+09 10737.4 -1 double (4x4) 14.471 50.8806 -1 (8x8) 126.756 365.627 -1 (16x16) 1006.85 1704.95 -1 (32x32) 8231.48 3100.18 -1 (64x64) 65971.9 2399.24 -1 (100x100) 249783 3104.76 -1 (128x128) 523642 3774.87 -1 (144x144) 745206 4095.06 -1 (160x160) 1.02516e+06 4213.03 -1 (176x176) 1.36634e+06 4415.94 -1 (192x192) 1.77349e+06 4381.55 -1 (200x200) 2.00454e+06 4480 -1 (256x256) 4.19941e+06 4473.92 -1 (400x400) 1.60114e+07 4654.55 -1 (500x500) 3.12034e+07 5000 -1 (512x512) 3.34892e+07 4880.64 -1 (600x600) 5.39871e+07 5184 -1 (700x700) 8.57451e+07 5276.92 -1 (800x800) 1.28045e+08 5120 -1 (900x900) 1.82392e+08 5400 -1 (1000x1000) 2.50284e+08 5263.16 -1 (1024x1024) 2.68788e+08 5113.06 -1 (1500x1500) 8.44488e+08 5232.56 -1 (2000x2000) 2.00047e+09 5194.81 -1 (2048x2048) 2.148e+09 5159.12 -1
si ca se trouve il ne cree qu'un seul thread ...
Je reconnais que c'est bizarre...
Je t'assure que tu as reçu les sources telles que je les aie compilées...
Mon programme semble bien créer 2 processus comme l'indique normalement le titre du fichier (MT2)
Essaye OpenMP pour voir en définissant la macro correspondante dans 'genial_config.h'. (ou en ligne de commande)
Essaye aussi la version mono-thread en ne définissant pas 'BLAS_THREADING'.
La comparaison des perfs permettra surement de voir si le multi-threading crée rellement 2 processus.
Branche éventuellement ATLAS en décommentant les trois lignes 182-184 du fichier main. Ca résoudra pas le problème mais ça donnera une référence mono-thread. (visiblement ta compilation d'ATLAS n'est pas multi-threadé malgré le paramétrage automatique de la dernière version "instable", contrairement à la version 3.6.0 qui, elle, semble obéir au doigt et à l'oeil...)
PS: Ta ligne de commande me parait correcte.
Pourtant on dirait vraiment que ton programme compilé est en mono-thread...
PS2: Je comprends pas: Les perfs de ton bench dans le message 197 étaient bonnes! J'ai rien dit... c'était déjà multi-threadé...
Juste un détail, les Core Duo ne bénéficient pas de l'architecture Core des Core 2 Duo, c'est l'architecture Centrino (Pentium Pro) des Dothan améliorée, c'est tout, il y a une sacré différence entre les 2 architecture (Conroe vs Yonah).
effectivement j'obtiens le meme temps en single thread ...
bon bah c'est pas normal :-/Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 Benchmark GEMM 48 15 SSE2.txt float (4x4) 14.471 54.9203 -1 (8x8) 126.756 380.457 -1 (16x16) 1006.85 2031.89 -1 (32x32) 8231.48 6830.49 -1 (64x64) 65971.9 4241.74 -1 (100x100) 249783 6028.57 -1 (128x128) 523642 7509.8 -1 (144x144) 745206 8104.81 -1 (160x160) 1.02516e+06 7987.2 -1 (176x176) 1.36635e+06 8774.76 -1 (192x192) 1.77349e+06 8965.33 -1 (200x200) 2.00454e+06 8800 -1 (256x256) 4.1994e+06 8947.85 -1 (400x400) 1.60115e+07 9752.38 -1 (500x500) 3.12032e+07 10000 -1 (512x512) 3.34894e+07 10504 -1 (600x600) 5.39865e+07 10285.7 -1 (700x700) 8.57452e+07 10976 -1 (800x800) 1.28045e+08 10971.4 -1 (900x900) 1.82375e+08 10414.3 -1 (1000x1000) 2.50336e+08 10526.3 -1 (1024x1024) 2.68791e+08 10475.5 -1 (1500x1500) 8.53325e+08 10714.3 -1 (2000x2000) 2.03484e+09 10958.9 -1 (2048x2048) 2.14745e+09 10942.6 -1 double (4x4) 14.471 54.222 -1 (8x8) 126.756 390.378 -1 (16x16) 1006.85 1710.2 -1 (32x32) 8231.48 3047.11 -1 (64x64) 65971.9 2409.23 -1 (100x100) 249783 3371.43 -1 (128x128) 523642 3754.9 -1 (144x144) 745206 4038.19 -1 (160x160) 1.02516e+06 4136.96 -1 (176x176) 1.36634e+06 4465.26 -1 (192x192) 1.77349e+06 4529.85 -1 (200x200) 2.00454e+06 4495.24 -1 (256x256) 4.19941e+06 4575.6 -1 (400x400) 1.60114e+07 4876.19 -1 (500x500) 3.12034e+07 5000 -1 (512x512) 3.34892e+07 5368.71 -1 (600x600) 5.39871e+07 5184 -1 (700x700) 8.57451e+07 5276.92 -1 (800x800) 1.28045e+08 5251.28 -1 (900x900) 1.82392e+08 5207.14 -1 (1000x1000) 2.50284e+08 5128.21 -1 (1024x1024) 2.68788e+08 5237.77 -1 (1500x1500) 8.44488e+08 5357.14 -1 (2000x2000) 2.00047e+09 5387.21 -1 (2048x2048) 2.148e+09 5368.71 -1
comment je pourrais savoir si 2 threads sont bien actifs en meme temps ?
Y compris avec OpenMP?Citation:
Envoyé par epsilon68
Je vois pas trop comment...Citation:
Envoyé par epsilon68
Peut-être:
-un bug dans l'implémentation du sémaphore pour Apple (et pourtant ça semble bien marcher...). Je te file une version Windows compilée avec GCC et le sémaphore prévu pour MacOS à essayer
-un autre problème dû à l'implémentation pthread de MacOS...
PS: Ca se passe aussi un peu comme si BLAS_THREADING n'était pas définie. Je n'y crois pas trop mais, essaye de le définir dans le fichier 'genial_config.h' au lieu de la ligne de commande.
oui y compris avec openmp
non definitivement le probleme est ailleurs, toutes les constantes sont bien definies donc...
comment pourrait-on faire pour voir le nombre de threads créés ? et voir qu'ils tournent bien en parallele ?
a+
EDIT: la version que tu as attachée marche parfaitement sur windows. Ca doit etre un truc vicieux qui se trame pour macosx ....