2011-09-23 14 views
5

¿Qué tan bien NVCC optimiza el código del dispositivo? ¿Hace algún tipo de optimizaciones como el plegado constante y la eliminación de subexpresiones comunes?¿Qué tan bueno es NVCC en las optimizaciones de código?

Por ejemplo, va a reducir el siguiente:

float a = 1/sqrtf(2 * M_PI); 
float b = c/sqrtf(2 * M_PI); 

a esto:

float sqrt_2pi = sqrtf(2 * M_PI); // Compile time constant 
float a = 1/sqrt_2pi; 
float b = c/sqrt_2pi; 

¿Qué pasa con las optimizaciones más inteligentes, que implican saber semántica de funciones matemáticas:

float a = 1/sqrtf(c * M_PI); 
float b = c/sqrtf(M_PI); 

a esto:

float sqrt_pi = sqrtf(M_PI); // Compile time constant 
float a = 1/(sqrt_pi * sqrtf(c)); 
float b = c/sqrt_pi; 

Respuesta

8

El compilador está muy por delante de usted. En su ejemplo:

float a = 1/sqrtf(2 * M_PI); 
float b = c/sqrtf(2 * M_PI); 

nvopencc (Open64) emitirá este:

mov.f32   %f2, 0f40206c99;  // 2.50663 
    div.full.f32 %f3, %f1, %f2; 
    mov.f32   %f4, 0f3ecc422a;  // 0.398942 

que es equivalente a

float b = c/2.50663f; 
float a = 0.398942f; 

El segundo caso se compila a esto:

float a = 1/sqrtf(c * 3.14159f); // 0f40490fdb 
float b = c/1.77245f; // 0f3fe2dfc5 

Supongo que la expresión para a generada por el compilador debería ser más precisa que su versión "optimizada", pero con la misma velocidad.

+0

Entonces, ¿* dobla * constante entonces? ¿Y qué compilador es nvOpen64? ¿Es NVidia o una versión de OSS? ¿Qué pasa con el segundo caso? –

+0

nvOpen64 es el compilador de NVIDIA, basado en [Open64] (http://www.open64.net/) (note nvcc no es un compilador), – talonmies

+0

Perdón por mi ignorancia, pero ¿qué es exactamente nvcc si no es un compilador? –

Cuestiones relacionadas