Bonjour,
J'écris une petite librairie d'arithmétique statique, contrairement à GMP qui est dynamique. Pour obtenir de bonne perf je dois écrire en assembleur.
Si je considere une addition de grand entier (>64 bits), j 'utilise un tableau de long int. Si je considère ma fonction addition je devrai tout d'abord loader mes datas (en assembleur x86-64, gas)
Cette structure marche très bien mais elle suppose que mes datas soit stockées sous le format AoS, pour divers raisons je souhaite utiliser le modèle SoA.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void vli256_add(boost::uint64_t * /*%%rdi*/, boost::uint64_t const * /*%%rsi*/) { asm ( "movq (%%rdi), %%r8 " // load la 1 ere data "movq 0x08(%%rdi), %%r9" // load la 2eme data successive
Je rappelle AoS : si on considère un grand entier A comme la suite de 2 long int (a0 et a1), en mémoire on a : a0a1 si je prend B C et D , j obtiendrai en mémoire a0a1 b0b1 c0c1 d0d1 le tout continue, en AoS, j obtiens
a0b0c0d0 a1b1c1d1. L'idée est d'ajouter un paramètre template pour permettre de passer d'une représentation à une autre. en pseudo code j'obtiendrai:
le pb et que n est dans une string donc il ne sera pas considéré un nombre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 template< int n> void vli256_add(boost::uint64_t * /*%%rdi*/, boost::uint64_t const * /*%%rsi*/) { asm ( "movq (%%rdi), %%r8" //idem "movq 0x08*n(%%rdi), %%r9 "// n donne l offset n=1 SoA, n=4 AoS "
Bref je ne sais pas trop comment mixer cette string d'assembleur et ce paramètre template ... (je suis un débutant en assembleur)
Partager