2011-09-23 77 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不是编译器,究竟是什么? –