12

Abbiamo portato su VS2015 un'applicazione VS2013 C++/MFC e stanno avendo alcuni problemi piuttosto fastidiosi con le prestazioni e il codice generato dal compilatore VS2015.log10() prestazioni su Visual Studio 2015 molto più lente di Visual Studio 2013 per x86

Nota per x86.

Sono le magnitudini più lente sulle chiamate log10(). Quando si profila una build Release utilizzando il campionamento della CPU, vediamo che queste chiamate richiedono molto più tempo rispetto a prima. Andando da es. 49 campioni sulla stessa corsa per VS2013 a ben 7545 campioni per la stessa corsa in VS2015. Ciò significa che questa funzione passa dallo 0,6% del carico della CPU al 50% per l'applicazione in questione.

In VS2013 profiler mostra:

Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples % 
__libm_sse2_log10 49 49 0.61 0.61 

In VS2015 profiler mostra:

Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples % 
___sse2_log102 7,545 7,545 50.43 50.43 

Perché un nome funzione diversa?

Abbiamo analizzato brevemente l'assembly generato per log10. Su VS2013 questo inoltra a disp_pentium4.inc e log10_pentium4.asm. Su VS2015 questo è diverso. Sembra che VS2015 torni a __libm_sse2_log10 in Debug.

La causa di questa differenza di prestazioni potrebbe essere la __sse2_log102? Abbiamo verificato che i risultati emessi dalle funzioni che li chiamano rientrino nelle differenze attese in virgola mobile.

Stiamo compilando con v140_xp bersaglio e hanno le seguenti opzioni di compilazione:

/Yu"stdafx.h" /MP /GS- /GL /analyze- /W4 /wd"4510" /wd"4610" /Zc:wchar_t /Z7 /Gm- /Ox /Ob2 /Zc:inline /fp:fast /D "WINVER=0x0501" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "_CRT_SECURE_NO_DEPRECATE" /D "_SCL_SECURE_NO_WARNINGS" /D "_USING_V110_SDK71_" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /GR /arch:SSE2 /Gd /Oy /Oi /MT 

dimostrato anche qui durante la visualizzazione di proprietà:

Optimization

Code generation

Tutte le impostazioni del progetto sono la lo stesso per entrambi VS2013 e VS2015. Nota che stiamo utilizzando SSE2 e che il modello a virgola mobile è impostato su veloce.

Qualcuno ha riscontrato lo stesso problema e sa come risolvere il problema?

+0

Una cosa che viene in mente è che Microsoft ha riscritto sostanzialmente le loro biblioteche, cf. [questo post del blog] (http://blogs.msdn.com/b/vcblog/archive/2015/09/25/rejuvenating-the-microsoft-c-c-compiler.aspx), inclusa la loro lib di matematica. La riscrittura probabilmente rientra tra le due versioni che confronti. –

+1

Tutto indica l'implementazione "__sse2_log102" in VS2015 è la causa, è molto più lento della vecchia implementazione. Se sostituiamo la chiamata a "log10()" con una chiamata a ippsLog10_64f_A53, questa regressione delle prestazioni viene rimossa. – nietras

+0

@PeterSchneider Grazie, sì, eravamo consapevoli di questo dato che la porta che abbiamo avuto aveva problemi con la virgola mobile alla formattazione delle stringhe, che è stata anche completamente riscritta. – nietras

risposta

5

Qui il mio commento come risposta.

Sembra che VS2015 è cambiato l'attuazione di log10 in build di rilascio, dove si chiama questa nuova __sse2_log102 funzione al posto del vecchio __libm_sse2_log10 e che questa nuova implementazione è la causa di una grande differenza di prestazioni.

La soluzione per noi in questo caso era chiamare un'implementazione disponibile nella libreria Intels Performance Primitives (IPP). Per esempio. invece di chiamare:

return log10(v); 

chiamate questo, invece:

double result; 
ippsLog10_64f_A53(&v, &result, 1); 
return result; 

Ciò ha provocato il problema di prestazioni a scomparire, in realtà era leggermente più veloce utilizzando un vecchio rilascio IPP 7.0. Tuttavia, non tutti possono utilizzare e pagare IPP, quindi speriamo che Microsoft risolva questo problema.

Di seguito è la versione di VS2015 che ha mostrato questo problema.

enter image description here