2011-09-23 13 views
5

In che modo NVCC ottimizza il codice del dispositivo? Fa qualche tipo di ottimizzazioni come il piegamento costante e l'eliminazione delle sub-espressioni comuni?Quanto è buono NVCC alle ottimizzazioni del codice?

Ad esempio, sarà di ridurre il seguente:

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

a questo:

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

Che dire di ottimizzazioni più intelligenti, che coinvolgono sapendo semantica delle funzioni matematiche:

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

a this:

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

risposta

8

Il compilatore è molto più avanti di te. Nel tuo esempio:

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

nvopencc (Open64) emetterà questo:

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

che è equivalente a

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

Il secondo caso viene compilato a questo:

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

Immagino che l'espressione per a generata dal compilatore debba essere più accurata della versione "ottimizzata", ma della stessa velocità.

+0

Quindi, * fa * il piegamento costante, quindi? E quale compilatore è nvOpen64? È una versione NVIDIA o OSS? E il secondo caso? –

+0

nvOpen64 è il compilatore NVIDIA, basato su [Open64] (http://www.open64.net/) (nota nvcc non è un compilatore), – talonmies

+0

Perdonami la mia ignoranza, ma cosa è esattamente nvcc se non è un compilatore? –

Problemi correlati