2011-09-23 67 views
5

NVCC如何優化設備代碼?它是否執行任何類型的優化,如常量摺疊和常見的子表達式消除?NVCC在代碼優化方面有多優秀?

例如,它會降低如下:

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

這樣:

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

什麼更聰明的優化,涉及知道的數學函數語義:

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

到這個:

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

回答

8

編譯器遠遠超過了你。在您的示例:

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

nvopencc(Open64)將發出這樣的:

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

這相當於

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

第二種情況被編譯此:

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

我猜測編譯器生成的a的表達式應該比您的「優化版」更精確,但速度大致相同。

+0

那麼,它*確實*不斷摺疊呢?什麼編譯器是nvOpen64?是NVidia還是OSS版本?第二種情況呢? –

+0

nvOpen64是基於[Open64](http://www.open64.net/)的NVIDIA編譯器(注意nvcc不是編譯器), – talonmies

+0

請原諒我的無知,但是如果nvcc不是編譯器,究竟是什麼? –