Trig Vectorized fonctionne en C?

Je cherche à calculer des fonctions sortinggonomésortingques fortement parallélisées (par blocs de 1024 environ) et j’aimerais tirer parti d’au moins une partie du parallélisme des architectures modernes.

Quand je comstack un bloc

for(int i=0; i<SIZE; i++) { arr[i]=sin((float)i/1024); } 

GCC ne le vectorisera pas, et dit

 not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38); 

Ce qui a du sens pour moi. Cependant, je me demande s’il existe une bibliothèque pour effectuer des calculs sortinggonomésortingques parallèles.

Avec une simple série de taylor du 11ème ordre, GCC vectorisera toutes les boucles et ma vitesse sera deux fois plus rapide qu’une boucle naïve du péché (avec des réponses exactes, ou avec des séries du 9ème ordre, un seul bit désactivé pour les deux dernières valeurs sur 1600, pour une accélération> 3x). Je suis sûr que quelqu’un a déjà rencontré un problème comme celui-ci auparavant, mais lorsque je recherche sur Google, je ne trouve aucune mention de bibliothèques ou autres.

A. Existe-t-il déjà quelque chose?
B. Si non, un conseil pour optimiser les fonctions sortinggonomésortingques parallèles?

EDIT: J’ai trouvé la bibliothèque suivante appelée “SLEEF”: http://shibatch.sourceforge.net/ qui est décrite dans ce document et utilise les instructions SIMD pour calculer plusieurs fonctions élémentaires. Il utilise du code spécifique à SSE et AVX, mais je ne pense pas qu’il sera difficile de le transformer en boucles en C standard.

Depuis que vous avez dit que vous utilisiez GCC, il semble y avoir quelques options:

Cela dit, je rechercherais probablement une solution dans GPGPU. Peut-être l’écrire dans CUDA ou OpenCL (si je me souviens bien, CUDA supporte la fonction sine). Voici quelques bibliothèques qui pourraient faciliter les choses.

Puisque vous cherchez à calculer les harmoniques ici, j’ai un code qui aborde un problème similaire . Il est déjà vectorisé et plus rapide que tout ce que j’ai trouvé. En plus, vous obtenez le cosinus gratuitement.

quelle plateforme utilisez-vous? De nombreuses bibliothèques de ce type existent déjà:

  • Intel fournit la Vector Math Library (VML) avec icc.
  • Apple fournit la bibliothèque vForce dans le cadre de la structure Accelerate.
  • HP fournit sa propre bibliothèque de mathématiques vectorielles pour Itanium (ainsi que d’autres architectures).
  • Sun a fourni à libmvec ses outils de compilation.

Au lieu de la série taylor, je regarderais les algorithmes utilisés par fdlibm. Ils devraient vous donner autant de précision avec moins de pas.

Ma réponse a été de créer ma propre bibliothèque pour faire exactement ceci appelé vecsortingg: https://github.com/jeremysalwen/vecsortingg