2009-08-18 5 views
6

Les fonctions mathématiques du framework .NET fonctionnent principalement sur des flottants double précision, il n'y a pas de surcharges de précision simple (float). Lorsque vous travaillez avec des données de précision simple dans un scénario de haute performance, cela entraîne des coulées inutiles et des fonctions de calcul avec plus de précision que nécessaire, de sorte que les performances sont affectées dans une certaine mesure.Opérations mathématiques à simple précision dans .NET?

Y a-t-il un moyen d'éviter une partie de cette charge supplémentaire du processeur? Par exemple. existe-t-il une bibliothèque mathématique open source avec des surcharges flottantes qui appellent les instructions FPU sous-jacentes directement? (Ma compréhension est que cela nécessiterait un soutien dans le CLR). Et en fait je ne suis pas sûr si les processeurs modernes ont même des instructions de précision simple.

Cette question a été en partie inspiré par cette question sur l'optimisation d'une fonction sigmoïde:

Math optimization in C#

Répondre

3

A ma connaissance, le .NET Framework ne comprend pas une API avec accès direct à intrinsics mathématiques. Les bibliothèques Mono incluent un support de travail pour les intrinsèques, mais je ne suis pas sûr de leur état.

[Edit:. Ce paragraphe est le commentaire pourquoi vous ne voyez pas les paramètres float surcharge] Un problème est la pile d'évaluation des CLI (par ECMA-335) ne distingue pas entre les types float et double. Une implémentation valide pourrait traiter tout comme double pour les opérations mathématiques, mais j'imagine que le CLR (l'implémentation de Microsoft de l'interface CLI) effectue des optimisations pour l'arithmétique simple précision là où c'est possible.

Je pense qu'il est un peu dommage que le problème des intrinsèques (en particulier les extensions SIMD) n'ait pas encore été résolu [dans un produit publié]. Mon outsider suppose que la prise en charge de l'intrinsèque nécessiterait des modifications importantes de la machine virtuelle qui posent des risques inacceptables à ce stade du cycle de publication de .NET Framework. Le garbage collector (et je pense que les mécanismes de gestion des exceptions) est étroitement couplé avec l'allocateur de registre, et les intrinsèques de soutien ajoute une nouvelle variable radicale à cette zone.

+0

Lorsque vous faites référence à instrinsics, est-ce la même chose que les fonctions externes? - comment les fonctions Math sont implémentées, par rapport aux intrinsèques définies dans le langage. AFIN que le CLR pourrait facilement être étendu pour mettre en œuvre par exemple. statique statique externe double Sin (float a) en plus de la version double précision. – redcalx

+1

Parlez-vous de l'implémenter en code natif? Le surcoût P/Invoke de cette opération pour une seule opération à virgule flottante annulerait complètement la tentative d'éviter l'impact sur les performances de travailler avec 'Sin (double)'. Les intrinsèques sont déclarées 'extern' mais ne sont pas P/Invoke - le code natif pour eux est géré en interne par le JIT lui-même pour les rendre aussi efficaces que possible. –

+0

Donc peut-être que certaines performances pourraient être obtenues si votre algorithme était tel que vous pourriez faire un seul P/Invoke qui fait beaucoup d'opérations flottantes. – Fantius

1

Oui, nous construisons une bibliothèque mathématique évolutive à haute performance qui utilise nativement des calculs en virgule flottante à simple précision si c'est tout ce dont vous avez besoin. Et vous avez raison, s'ils sont correctement implémentés, ils peuvent être beaucoup plus rapides qu'avec une double précision.

Consultez la bibliothèque mathématique this de CentreSpace Software.

Paul

+1

Donc, cette bibliothèque appelle vraisemblablement du code non managé? – redcalx

+1

Oui, c'est correct. – Paul