compilateur 3dnow!

compilateur 3dnow! - Programmation

Marsh Posté le 17-01-2001 à 22:08:49    

existe-t-il un compilateur C/C++ produisant du code optimisé 3dnow ?

Reply

Marsh Posté le 17-01-2001 à 22:08:49   

Reply

Marsh Posté le 17-01-2001 à 22:55:42    

non, et à ma connaissance aucun compilateur ne génère du code SIMD (3dnow!, SSE, MMX), ou alors uniquement les instructions scalaires.

Reply

Marsh Posté le 18-01-2001 à 00:37:38    

j'ai cru lire que ça existait pour SSE mais je suis sur de rien.

Reply

Marsh Posté le 18-01-2001 à 10:20:07    

wave > As-tu fini d'optimiser ton moteur 3D en 3dnow! ??

Reply

Marsh Posté le 18-01-2001 à 10:22:18    

VectorC que je sais plus trop qui. J'avais la version beta (gratuite), maintenant ca doit etre payant.
 
Sinon Visual Studio version pro supporte le 3DNow!, mais en macro seulement...

Reply

Marsh Posté le 18-01-2001 à 10:30:38    

zop non j'ai pas commencé. Après une journée de programmation PS2 la vue d'un PC me donne des boutons.

Reply

Marsh Posté le 18-01-2001 à 10:44:13    

wave a écrit a écrit :

zop non j'ai pas commencé. Après une journée de programmation PS2 la vue d'un PC me donne des boutons.

 





 
Au fait comme t'es directement impliqué dans la programmation de la PS2 j'aimerais avoir ton avis (d'expert) sur la complexité de la programmation de la PS2. J'ai lu un peu partout qu'elle a sûrement un énorme potentiel mais qu'il est très difficile à exploiter ??? Ton avis de programmeur ???

Reply

Marsh Posté le 18-01-2001 à 10:51:03    

exactement: elle est puissante, peut afficher beaucoup de polygones mais c'est une vraie merde à programmer, les librairies sont mal foutues ou bugguées et quelquefois documentées en japonais uniquement. Rien que de créer un CD bootable à partir d'une démo qui tourne sur le kit de développement ça demande du boulot!

Reply

Marsh Posté le 18-01-2001 à 11:03:59    

une autre question à wave : les Japonais lorsqu'ils conçoivent leur console, est-ce qu'ils vous contactent pour avoir votre avis sur des choix conceptuels ou pas du tout ? Ou alors c'est une fois qu'ils sont en phase terminale de la conception de leur future machine qu'ils viennent vous voir avec une doc ou un kit de développemnt ?

Reply

Marsh Posté le 18-01-2001 à 11:09:14    

ils doivent bien consulter quelques développeurs (quoique j'en sais rien) mais s'ils me montrent les caractéristiques sur papier je dirai que la PS2 est excellente, alors qu'en pratique je suis pressé de ne plus y toucher.

Reply

Marsh Posté le 18-01-2001 à 11:09:14   

Reply

Marsh Posté le 18-01-2001 à 11:11:49    

En effet il y a VectorC qui génère du code SIMD.(http://www.codeplay.com/)
 
Pour obtenir les performances optimales y'a qques guidelines à respecter... quitte à faire un effort, autant programmer directement en macros (enfin c'est mon avis).

Reply

Marsh Posté le 18-01-2001 à 11:15:50    

bien-sur mais si ça permet déjà de gagner en vitesse sur des gros fichiers sources qu'on n'a pas envie de retoucher ça m'intéresse. Surtout sur mon K6-3.

Reply

Marsh Posté le 18-01-2001 à 14:47:15    

bon...
 
j'ai lu rapidos sur le site d'AMD que :
 
1) Toutes les nouvelles versions de compilateurs de tout langage sont compatible SSE/3DNow/MMX sans problème (le code généré supporte les 3 types d'instruction), car Intel et AMD leur ont fournit tout ce qui était nécessaire pour implémenter.
 
2) Les instructions 3DNow! et 3DNow! Etendues sont suffisament bien gérées pour le le proco les utilise même si ce n'est pas stipulé dans le code assembleur...
En effet, son architecture RISC de Digital lui permet d'analyser les instructions x86, les réinterprêter et les optimiser avant de les exécuter. C'est un système propriétaire de Digital, existant depuis plus de 5 ans dans le monde Unix.
 
Car chacun sait ici j'espère que l'Athlon est un proco RISC avec un interpréteur x86... (le PIII suis la même voie, mais plus en recul)

 

Reply

Marsh Posté le 18-01-2001 à 15:24:47    

hum...
L'athlon est un proc CISC car il utilise un jeu d'instruction CISC. Qu'il utilise des méthodes empruntées au RISC, c'est son problème, il execute quand-meme un code CISC.
Ensuite, 3dnow c'est un ensemble d'instructions asm et comme toute instruction asm, le proc ne l'exécute que si on le lui demande explicitement. La plupartssdes compilos n'utilisent PAS ces instructions et en sont incapables. Dans ce cas (ex: visual c++) on peut utiliser des macros en assembleur mais ça ne permet pas d'écrire du code C/C++ générique qui utilisera 3dnow. Ce que tu dis est vrai pour les micros-instructions internes au processeur (rien à voir avec 3dnow), absolument pas pour les instructions que le programmeur donne au cpu.
 
En gros, c'est faux d'un bout à l'autre.

Reply

Marsh Posté le 18-01-2001 à 20:43:58    

wave > Non non non non !
 
Athlon (Et PIII) utilise en effet des instructions CISC.
 
Mais le core du proc n'est pas CISC mais RISC.
 
Il y a un intermréteur d'instruction CISC -> RISC au niveau du chipset et du processeur.
 
Ensuite, là où l'Athlon est meilleur par rapport au PIII, c'est qu'il "comprends" les instructions qu'on lui passe et refait sa sauce afin d'utiliser toutes ses capacités...
 
A mon argumentation s'ajoute ce fichier (3 Mo) qui vient du site d'AMD :
 
http://www.amd.com/products/cpg/at [...] /22007.pdf
 

Citation :

As a decoupled decode/execution processor, the AMD Athlon
processor makes use of a proprietary microarchitecture, which
defines the heart of the AMD Athlon processor. With the
inclusion of all these features, the AMD Athlon processor is
capable of decoding, issuing, executing, and retiring multiple
x86 instructions per cycle, resulting in superior scaleable
performance.


Traduction : L'athlon est capable d'éxécuter en parallèle plusieurs instruction x86, grâce à son architecture.
 

Citation :

Although the AMD Athlon processor can extract code
parallelism on-the-fly from off-the-shelf, commercially available
x86 software, specific code optimization for the AMD Athlon
processor can result in even higher delivered performance. This
document describes the proprietary microarchitecture in the
AMD Athlon processor and makes recommendations for
optimizing execution of x86 software on the processor.


Optimiser le code x86 pour l'athlon permet de meilleurs perfs (sans avoir à utiliser les instruction MMX ou 3DNow!)
 

Citation :

However, many of these optimizations are not
necessary for the AMD Athlon processor to achieve maximum
performance. Due to the more flexible pipeline control and
aggressive out-of-order execution, the AMD Athlon processor is
not as sensitive to instruction selection and code scheduling.
This flexibility is one of the distinct advantages of the
AMD Athlon processor.


Grace à son pipeline plus flexible la plupart des optimisations spécifiques aux pentium n'est plus nécessaire.
 
Maintenant, en C : (optimiser le code C permet de générer un code assembleur apte à être optimisé par l'ahtlon)
 

Citation :

Example 1 (Avoid):
double x;====>MOV [temp+4 ],0
unsigned int i;MOV EAX,i
MOV [temp ],EAX
x =i;FILD QWORD PTR [temp ]
FSTP QWORD PTR [x ]
The above code is slow not only because of the number of
instructions, but also because a size mismatch prevents store-to-load
forwarding to the FILD instruction. Instead, use the
following code:
Example 1 (Preferred):
double x;====>FILD DWORD PTR [i ]
int i;FSTP QWORD PTR [x ]
x =i;


 

Citation :

Example 2 (Avoid):
int i;====>MOV EAX,i
CDQ
i =i /4;AND EDX,3
ADD EAX,EDX
SAR EAX,2
MOV i,EAX
Example 2 (Preferred):
unsigned int i;====>SHR i,2
i =i /4;


 

Citation :

In summary:
Use unsigned types for:
Division and remainders
Loop counters
Array indexing
Use signed types for:
Integer-to-float conversion


 

Citation :

Example 1 (Avoid):
double x [VECLEN ],y [VECLEN ],z [VECLEN ];
unsigned int k;
for (k =1;k <VECLEN;k++){
x [k ] ==x [k-1 ] ++y [k ];
}
for (k =1;k <VECLEN;k++){
x [k ] ==z [k ] **(y [k ] --x [k-1 ]);
}
Example 1 (Preferred):
double x [VECLEN ],y [VECLEN ],z [VECLEN ];
unsigned int k;
double t;
t =x [0 ];
for (k =1;k <VECLEN;k++){
t =t +y [k ];
x [k ] ==t;
}
t =x [0 ];
for (k =1;k <VECLEN;k++){
t =z [k ] **(y [k ] --t);
x [k ] ==t;
}


 

Citation :

Example 1 (Avoid):
int days_in_month,short_months,normal_months,long_months;
switch (days_in_month){
case 28:
case 29:short_months++;break;
case 30:normal_months++;break;
case 31:long_months++;break;
default:printf ("month has fewer than 28 or more than 31
days
" );
}
Example 1 (Preferred):
int days_in_month,short_months,normal_months,long_months;
switch (days_in_month){
case 31:long_months++;break;
case 30:normal_months++;break;
case 28:
case 29:short_months++;break;
default:printf ("month has fewer than 28 or more than 31
days
" );
}


 

Citation :

Example 1:
for(i ...){
if(CONSTANT0 ){
DoWork0(i );//does not affect CONSTANT0
}else {
DoWork1(i );//does not affect CONSTANT0
}
}
Transform the above loop into:
if(CONSTANT0 ){
for(i ...){
DoWork0(i );
}
}else {
for(i ...){
DoWork1(i );
}
}


 
... etc.

 

Reply

Marsh Posté le 18-01-2001 à 20:45:17    

Bon, désolé, le code passe pas bien à l'écran... Tu verras mieu dans le PDF.

 

Reply

Marsh Posté le 18-01-2001 à 21:40:56    

le processeur lit des instructions cisc avec tous les inconvénients que ça comporte:longueur d'un opcode variable et instruction + complexe à décoder (entre autres). Qu'il réorganise l'ordre des micro-instructions c'est très bien mais c'est pas ça qui va faire aller la fpu 32/64 bits à la vitesse d'une instruction 3dnow (32 bits avec précision inférieure pour les inverses et racines carrées), pour la bonne raison que le boulot exécuté n'est PAS LE MEME.
optimiser pour athlon permet d'avoir de meilleures perfs: bien-sur mais optimiser ET utiliser les instructions 3dnow permet d'aller encore + vite!
L'athlon est capable d'éxécuter en parallèle plusieurs instruction x86, grâce à son architecture: oui, heureusement car le pentium aussi.
L'athlon est excellent mais c'est pas la peine de dire que 3dnow ne sert à rien, ni qu'il s'utilise tout seul, ni que tous les compilos l'utilisent (loin de là). C'est tout ce que je voulais dire.

Reply

Marsh Posté le 19-01-2001 à 12:07:22    

ya un petit util pour utiliser les instructions 3dnow dans delphi que j'avais utilisé au début de mes études...
c'est ici:
http://www.yks.ne.jp/~hori/program-e.html
( ça permet aussi d'utiliser les instructions:ss
MMXss
Streaming SIMD Extensionsss
CPUID (486)ss
RDTSC (Pentium)ss
CMOVxx (Pentium Pro)ss
3DNow!! )
 
c'est l'auteur de delphix ( les composants DirectX pour delphi )
wave a raison, d'ailleurs ya des articles sympas à ce sujet et sur les architectures des proc sur http://www.arstechnica.com
 
Yop yop

Reply

Marsh Posté le 21-01-2001 à 20:52:27    

up!

Reply

Marsh Posté le 22-01-2001 à 00:01:18    

Voilà qques jours que je cherche qques infos sur le sujet, et en effet il semblerait que le compilo Intel génère du code SIMD, ou du moins qu'il y ait une étape de vectorisation :
 
"Vectorization detects patterns of sequential data accesses by the same instruction, and transforms the code for Single-Instruction Multiple-Data (SIMD) execution."
 
Le lien d'origine
http://developer.intel.com/softwar [...] zation.htm

Reply

Marsh Posté le 22-01-2001 à 11:05:55    

il parait effectivement que le compilo d'intel le fait mais pour SSE, pas 3dnow évidemment.

Reply

Marsh Posté le 22-01-2001 à 13:21:51    

Ca semble être une nouveauté de la version 5.
J'avais utilisé la version 4 de ce compilo, et c'était la catastrophe niveau optimisation, enfin en tout cas largement en dessous de Visual 6.
Si j'ai l'occasion de tester la version 5 je vous tiendrai au courant.
 
Sinon rien de tel dans le SDK d'AMD. Juste des librairies optimisées fournies...

Reply

Marsh Posté le 23-01-2001 à 00:05:37    

pour compléter ce débat CISC/[RISC+interprétationCISC], précisont l'arrivée d'un nouveau venu, qui a faillit se terminer en vaporware, mais bon... Je pense qu'il est important de préciser son existance, car peut de personnes en parlent.
Mon regard seras critique, avant tout sur la technologie dite "papier", puis sur le bébé en lui même, et je parlerais de son avenir juste après. Donc, ce fameu proco, le Crusoe de Transmetta est né...ssTransmetta est une boite, créée par le N° de chez M$, et qui embauche Linus Torvalds (vous savez, le mome qui a fait Linux...)... Déjas, ca commence mal ;) Mais bon...
Sur le cahier des charges, le Crusoé est décrit comme étant destinné aux portables, et à tout ce qui peut se raprocher de l'embarqué. Cela impliquait une faible consomation d'énergie, et un faible dégagement de chaleur (comme dirait Joule, l'un entraine l'autre ;) ). Le but étant aussi de garder un proco compatible x86 (rha caca :(), pour pouvoir s'implanter aisément dans le marché.
Transmetta c'est acharné à répondre à ses critères durant la création du Crusoe, mais en conservant quand même des performances honnorables. Cela, ils l'ont réalisés en utilisant une technique plutot étrange, mais qui, a prioris porte ses fruits : le but est d'obtenir un processeur CISC (processeur à jeu d'instruction complexe, c'est à dire qui comprends beaucoup d'instructions, qui exécute des instructions complexes en peut de cycles, mais qui consomme comme une voiture haut de gamme, et qui chauffe comme un grille pain!) qui est le x86, mais en ayant les avantages d'un processeur RISC (processeur à jeu d'instruction réduit, c'est à dire qui comprends un petit nombre d'instructions, qui les exécutes super rapidement, mais vraiement super rapidement, et qui consome peut, et qui dégage très peut de chaleur). Intel et AMD ont choisis de construire un processeur autour d'un core RISC (comme le dit Magic Buzz), puis qui ajoutent une partie qui rends ce RISC compatible avec le set d'instruction CISC propres à nos x86, en transformant ces instructions complexes en instructions RISC, en adaptant le code en même temps (optimisation, exécution parallèle, prédiction de branche, ...), mais tout cela de facon matérielle (en grande partie tout du moins). Ces choix (l'implémentation d'AMD étant tout de même techniquement supérieure à celle d'Intel, notement grace à certaines technologies tirées des Alphas, procos supers puissants, et novateurs...) ont entrainés des processeurs encores plus volumineux (mais c'est compensé heureusement en partie grace aux nouvelles techniques de gravage, et heureusement, car quand on voit la taille d'un P3, et qu'on se dit que ca aurait pus etre pire...), encore plus gourmands en énergie, et donc (encore une fois merci à Mr Joules) encore plus calorifiques (ce qui entraine des systèmes de refroidissement plus conséquents, donc plus d'énergie, donc plus de dégagement... bref, le phénomème met du temps à s'auto amortir...). Donc les nouveaux procos sont super vachement plus puissants, mais ils sont énormes, consoment un max, et chauffent beaucoup (qui à dit énormément? ;)). L'iddée de Transmetta est justement de ne pas faire les mêmes erreurs... en implémentant la compatibilité x86 de facon logicielle... C'est le "Code-Morphing", technologie déposée par Transmetta, et qui permet de garder tous les avantages du RISC (perfs, taille, conso, faible dégagement de chaleur, ...), les instructions CISC, les avantages des nouveaux procos de chez AMD et Intel (Performances, optimisation, ...) sans les inconvéniants qu'amennent l'implémentation hardware (taille, conso, chaleur, ...). De plus, cela comporte d'autres avantages, comme celui de rendre ce processeur compatible avec d'autres familles de processeurs (architectures), par simple modification logicielle. Et imaginez un processeur sur lequel on pourait coriger les bugs qui existeraient dans la partie logicielle (LE RISC est facile à dessiner, donc super vachement moins de chance d'y foutre des erreurs que dans un CISC...)!
Pour les impératifs en terme de conso et de chaleur, ce comparatif à été effectué : un Crusoé TM5400 700 MHz, contre un Athlon 700 MHz tous deux gravés à 0.18 microns. Les chiffres parlent d'eux même : athlon = 100°C et 34W, Crusoé = 40 °C et 1W... alors, c'est t'y pas beau? Et, en plus, comme cado Bonux, le Crusoé adapte sa fréquence en foction de la charge qu'on lui soumet... en gros, le TM5400 (700MHz) n'est à 700MHz que quand il a une forte charge...
 
Mais point de vue performances, que dire? Et bien, je connait deux heureux possesseurs de Sony Vaio Ultraportables équipés du TM5400 en question... mais pour l'instant, leur bébé est sous win Meuh, et ils ne font essenciellement que du Word/mail/net/... donc pas très évocateur en termes de perfs (wow, Word 2000 se charge en moins d'une minute, c'est moyen!). Je vais donc voir avec eux si je peut effectuer des benchs, voire même me rendre compte par moi même, parcequ'il y en a un qui m'as l'air motivé par l'iddée d'installer un nunux 2.4.x (le zoli noyeau qui gère le code morphing, au lieu de se contenter de la x86 compat...), je pourait donc vous dire...
Sinon, il faut voir aussi que le crusoé vise principalement les machines nomades et l'embarqué. Malgrès les avantages qu'il avance, Transmetta parviendra-t'il quand même à s'inssérer dans le marché? Tout dépendras de leur politique commercial, et des réactions du public face à ce proco. Sony fournit déjas des Crusoés, mais d'autres constructeurs/assembleurs le suivront'ils?
... affaire à suivre!
 

 


--Message édité par PinG--

Reply

Marsh Posté le 23-01-2001 à 13:41:44    

Juste une précision : le Crusoë repose sur une architecture interne VLIW (Very Long Instruction Word). La partie code-morphing du proc transforme les instructionx x86 en instructions VLIW ...

Reply

Marsh Posté le 23-01-2001 à 15:04:51    

zop a écrit a écrit :

Juste une précision : le Crusoë repose sur une architecture interne VLIW (Very Long Instruction Word). La partie code-morphing du proc transforme les instructionx x86 en instructions VLIW ...

 




vala... en fait, c'est ce qui lui permet d'exécuter plusieurs instructions en parallèle, entre autres. C'est très souvent utilisé quand on transforme un CISC en RISC (encore une fois, pour beaucoup d'avantages), mais le Crusoé gère ca très bien, disont le, et comme le core RISC du crusoé est superscalaire (comme beaucoup), bien concu et performant, le crusoé devrait surpasser ses concurents.
pour plus d'infos sur le VLIW : http://www.research.ibm.com/vliw/basic.html
 

 


--Message édité par PinG--

Reply

Marsh Posté le 26-01-2001 à 15:58:20    

up!

Reply

Marsh Posté le 26-01-2001 à 21:24:51    

Avec visual C++ 6.0 c'est possible mais en assembleur.
 
Sur le Site AMD tu recupéré le SDK Athlon et chez microsoft le SP4 pour Visual C++ 6.0 ainsi que le processor pack pour compiler en assembleur specifique AMD avec Visual.
 
J'ai fait un algo de produit de convolution en 3Dnow, c'est cool tu peux faire 2 multiplications en virgule flottante simple précision en meme temps combiné avec 2 additons en flottant simple précision, du fait que l'unité d'addition et de multiplication sont distincte.

Reply

Marsh Posté le 27-01-2001 à 00:02:13    

wave tu fais bien de nous réveiller de temps en temps avec un p'tit up :)
j'ai recompilé qques programmes avec la version 5 du compilo Intel (limitée à 30 jours), en particulier en activant les flags qui vont bien, à savoir génération de code SSE (-QxK)
Et en effet il utilise des instructions SSE, mais dans le code que j'ai recompilé il n'a généré que des instructions scalaires...
Au niveau des performances, j'ai gagné 2 ou 3% sur une décompression mpeg (qui, à priori, se prête bien à ce genre d'optimisation vectorielle).
Rien de bien transcendant, disons que ça a le mérite de ne demander aucun effort d'optimisation manuelle. Par contre après il faut se prendre un peu le chou parce qu'évidemment ce code ne se fonctionne qu'en présence de SSE ...
 
Je n'ai pas mené des tests approfondis, et je suis certainement passé à côté de qques subtilités. Si d'autres ont essayé ce compilo je veux bien leur avis.

Reply

Marsh Posté le 29-01-2001 à 23:48:05    

Allez un p'tit UP !
Chacun son tour, wave doit en avoir marre d'upperss :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed