Pour un projet de loisir sur lequel je travaille, j'ai besoin d'émuler certaines opérations entières de 64 bits sur un processeur x86, et il doit être rapide.Émulation SSE optimisée d'entiers 64 bits
Actuellement, je fais cela via des instructions MMX, mais ce qui est vraiment une douleur à travailler avec, parce que je dois vider l'état du registre fp tout le temps (et parce que la plupart des instructions MMX traitent signé entiers, et J'ai besoin d'un comportement non signé). Donc, je me demande si les gourous SSE/optimisation ici sur SO peuvent arriver à une meilleure mise en œuvre en utilisant SSE.
Les opérations dont j'ai besoin sont les suivants (tout à fait spécifiques):
uint64_t X, Y;
X = 0;
X = 1;
X << 1;
X != Y;
X + 1;
X & 0x1 // get lsb
X | 0x1 // set lsb
X > Y;
Plus précisément, je ne ont pas besoin plus d'usage général ou le déplacement, par exemple, il suffit d'ajouter un et à gauche un quart de travail. Vraiment, juste les exact opérations montrées ici. Sauf, bien sûr, sur x86, uint64_t
est émulé en utilisant deux scalaires 32 bits, ce qui est lent (et, dans mon cas, ne fonctionne tout simplement pas, car j'ai besoin de charges/magasins pour être atomique, qui ils ne le seront pas lors du chargement/stockage de deux registres séparés).
Par conséquent, j'ai besoin d'une solution SIMD. Certaines de ces opérations sont triviales, supportées par SSE2 déjà. D'autres (!=
et <
) nécessitent un peu plus de travail.
Suggestions? SSE et SSE2 vont bien.Il avait pris un peu de persuasion pour permettre SSE3 et SSE4 est probablement hors de question (A CPU qui prend en charge SSE4 est susceptible de fonctionner 64 bits de toute façon, et donc je ne pas besoin de ces solutions de contournement)
L'addition de 64 bits est directement prise en charge dans SSE2. Je suppose que vous avez également besoin de multiplications 64 bits? 64 x 64 -> 64 bits (moitié inférieure), ou avez-vous besoin de 64 x 64 -> 128 bits? – Mysticial
Multiplier n'est pas nécessaire, juste les opérations spécifiques que j'ai montrées ci-dessus (donc pas même l'addition générale, juste incrément de 1. Et oui, l'addition est fournie par SSE2, mais je pensais que je pourrais aussi montrer toutes les opérations Pour être complet, cela signifie que certains d'entre eux sont faciles :) – jalf
À quoi voulez-vous que les opérateurs logiques soient édités? Registre général? ou SSE? – Mysticial