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;
答案 0 :(得分: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
的表达式应该比“optmized”版本更准确,但速度大致相同。