2009-10-28 15 views
1

J'ai un code SIMD dans Altivec traitant des valeurs entières de 32 bits en parallèle. Dans certains cas, je veux charger les entiers comme peu endian, dans d'autres cas comme big endian (note: ce choix est indépendant de l'endianess natif du CPU, il est basé sur quel algorithme est en cours d'exécution). Faire l'échange d'octets réel est très facile en utilisant les opérations de permutation d'Altivec, comme documented by Apple. La partie qui m'inquiète est que PowerPC permet une opération en gros ou en petit boutiste, et donc je ne sais pas si j'ai besoin d'échanger des octets sur de petites charges/magasins endianiques ou de gros stock/magasins endiens. (Actuellement, mon code le fait toujours pour le petit boutiste et ne permute jamais pour les grosses opérations de mémoire endiennes, ce qui fonctionne bien sur la 970 que j'utilise actuellement puisque, bien sûr, elle fonctionne en big-endian). D'après ce que je peux trouver, les PPC en mode little-endian sont relativement rares, mais ils existent, et idéalement, j'aimerais que mon code fonctionne correctement et rapidement quel que soit le mode.Gestion d'Altivec charge et stocke indépendamment de l'endianness PPC?

Existe-t-il un moyen de gérer les gros et les petits charges endian dans les registres AltiVec indépendamment de l'endianness du processeur? Y a-t-il d'autres problèmes liés à cela que je devrais connaître? Les opérations AltiVec, bien qu'elles soient en 128 bits, sont traitées comme si elles étaient en 64 bits, ce qui permet une compatibilité avec les cartes mères little-endian conçues avant AltiVec. "

ce qui me fait penser qu'il pourrait y avoir d'autres méchancetés spécifiques à AltiVec en mode little-endian.

+0

Je ne suis pas familier avec AltiVec mais généralement dans le code qui doit fonctionner avec des E/S binaires, j'essaie de commencer par détecter par programme l'ordre des octets, puis de permuter si nécessaire. Très probablement pas la réponse que vous cherchiez. –

+0

C'est à peu près le meilleur que je peux trouver, mais apparemment PPC peut réellement changer endianess à l'exécution en définissant ou effaçant un peu dans un MSR. Et faire un test endian avant chaque chargement ou magasin est si rien d'autre vraiment moche, et probablement aussi un peu lent, donc j'espère qu'il y a une meilleure méthode. –

Répondre

2

Presque tout le code PowerPC là-bas va supposer big-endian et tout le code ARM là-bas prendra peu de sens.

Il y a quelques cas spécialisés où endian-échangisme est utilisé — apparemment VirtualPC se est fondé sur le mode peu endian et donc d'abord ne fonctionnait pas sur le G5 (qui ne comprend pas) — mais je ne serais pas inquiète celles-ci.

ARM a un problème similaire en mode big-endian: les doubles sont mixtes-endian. Le "pseudo-endianisme" est obtenu en XOR les bits d'adresse de poids faible avec 0x2 (pour les accès demi-mot) et 0x3 (pour les accès octets) de sorte que l'ordre effectif dans un mot de 32 bits est permuté, mais accès au bit. Je pense que la même astuce est utilisée sur PowerPC, sauf 64 bits à la fois.

+0

Les choses ont beaucoup changé depuis '11; La plupart des machines POWER fonctionneront maintenant en little-endian (et il y en aura toujours BE-too). Heureusement, vous connaissez l'endianness au moment de la compilation, donc si vous avez besoin de supporter les deux, vous pouvez faire un petit test 'BYTE_ORDER' dans le préprocesseur. –