2010-05-25 10 views
2

J'ai besoin d'appeler Atan sur des millions de valeurs par seconde. Y at-il une bonne bibliothèque pour effectuer cette opération en batch très rapidement. Par exemple, une bibliothèque qui transmet la logique de bas niveau en utilisant quelque chose comme SSE?Bonne bibliothèque .NET pour la trigonométrie de streaming/batching rapide (Atan)?

J'ai profilé l'application, et je sais que cet appel à Atan est un goulot d'étranglement.

Je sais qu'il existe un support pour cela dans OpenCL, mais je préférerais faire cette opération sur la CPU. La machine cible peut ne pas supporter OpenCL. J'ai également examiné l'utilisation d'OpenCV, mais sa précision pour les angles Atan est seulement de ~ 0,3 degrés. J'ai besoin de résultats précis.

+0

Quelle précision avez-vous besoin et quelles sont vos valeurs d'entrée –

+0

simple ou double précision (int, float, double, autre valeur unique, ou y/x paire?) est OK. Je voudrais une précision d'environ 1/3600 d'un degré. – Sean

+0

J'ai effectué un traçage des performances avec dotTrace et constaté que le goulot d'étranglement n'était pas l'appel Atan, mais l'opération d'affectation que j'utilisais sur la même ligne. Je suis toujours intéressé, cependant, dans toutes les bonnes bibliothèques trig pour les opérations de streaming/batched. – Sean

Répondre

1

Pourquoi n'essaies-tu pas Brahma? À mon avis, c'est une bibliothèque GPGPU libre et open source qui ne dépend pas d'OpenCL, mais qui convertit le code en shaders HLSL/GLSL via LINQ.

EDIT: Exemple de code:

ComputationProvider provider = new ComputationProvider(); 
CompiledQuery query = provider.Compile<DataParallelArray<float>>(
    data => from value in data 
      select (float)Math.Atan(value)); // Do your calculations here... 

DataParallelArray<float> input = new DataParallelArray<float>(provider, new float[] { 0, 1, 2, 3, 4, 5, 6, 7, }); // etc... 
IQueryable result = provider.Run(query, input); 

foreach (float value in result) 
    Console.WriteLine(value); 
+0

Très intéressant. Je n'avais pas entendu parler de Brahma. – Sean

+0

Il ne semble pas qu'il fournit des fonctions trigonométriques? – Sean

+0

Réponse éditée. Brahma supporte en fait les fonctions trigonométriques. Toutes les fonctions System.Math sont supportées tant qu'elles sont équivalentes en HLSL/GLSL. – YellPika