SIMD préfère-t-il toujours se débarrasser des twigs?

Si vous écrivez du code SIMD qui sera exécuté par un autre programme, est-il toujours avantageux de supprimer les twigs pour augmenter les performances? J’ai entendu dire que même faire des opérations supplémentaires juste pour éviter les déclarations if/else , etc. est encore beaucoup plus rapide.

Je demande ceci parce que j’ai quelques twigs que je fais qui sont fondamentalement comme ceci:

 // axis; x=0, y=1, z=2 float p, q; if (axis == 0) { p = point.y; q = point.z; } else if (axis == 1) { p = point.x; q = point.z; } else if (axis == 2) { p = point.x; q = point.y; } 

Puis-je éviter ce type de ramification avec une astuce intelligente?

La plupart des architectures SIMD ont des instructions spéciales qui vous permettent de sélectionner conditionnellement des éléments basés sur un vecteur de masque. Le vecteur de masque est généralement le résultat d’une instruction de comparaison SIMD. Alors oui, il est assez facile de se débarrasser du type de twigs que vous avez dans votre exemple ci-dessus.

La nécessité de vous débarrasser d’une twig donnée dépend toutefois de divers facteurs tels que la prévisibilité de la twig, la nature (statistiques) des données et le volume de code exécuté de manière conditionnelle. En règle générale, le sans-twig est bon, mais comme dans la plupart des règles, il existe des exceptions.