Le funzioni matematiche del framework .NET funzionano principalmente su float a doppia precisione, non ci sono sovraccarichi di precisione singoli (float). Quando si lavora con dati a precisione singola in uno scenario ad alte prestazioni, ciò comporta un lancio non necessario e anche il calcolo delle funzioni con una precisione maggiore rispetto a quella richiesta, pertanto le prestazioni sono in qualche modo compromesse.Operazioni matematiche di precisione singola in .NET?
C'è un modo per evitare parte di questo sovraccarico della CPU? Per esempio. c'è una libreria matematica open source con sovraccarichi float che chiama direttamente le istruzioni FPU sottostanti? (La mia comprensione è che ciò richiederebbe un supporto nel CLR). E in realtà non sono sicuro che le moderne CPU abbiano anche istruzioni di precisione singola.
Questa domanda è stata in parte ispirata a questa domanda su come ottimizzare una funzione sigmoide:
Quando si fa riferimento a instrinsics, equivale a funzioni esterne? - che è come vengono implementate le funzioni matematiche, rispetto a quelle intrinseche definite nella lingua. AFAIK il CLR potrebbe essere facilmente esteso per implementare per es. pubblico statico extern doppio Sin (float a) in aggiunta alla versione a doppia precisione. – redcalx
Stai parlando di implementarlo nel codice nativo? Il sovraccarico di P/Invoke di farlo per una singola operazione in virgola mobile annullerebbe completamente il tentativo di evitare l'impatto sulle prestazioni di lavorare con 'Sin (double)'. Gli intrinsechi sono dichiarati "extern" ma non sono P/Invoke - il codice nativo per loro è gestito internamente dal JIT stesso per renderli il più efficienti possibile. –
Quindi forse si potrebbero ottenere delle prestazioni se il proprio algoritmo fosse tale da poter creare un singolo P/Invoke che faccia molte operazioni float. – Fantius