NVCC在代码优化方面有多好?

Ale*_*x B 5 cuda gpgpu

NVCC如何优化设备代码?它是否进行任何类型的优化,如常量折叠和常见的子表达式消除?

例如,它会减少以下内容:

float a = 1 / sqrtf(2 * M_PI);
float b = c / sqrtf(2 * M_PI);
Run Code Online (Sandbox Code Playgroud)

对此:

float sqrt_2pi = sqrtf(2 * M_PI); // Compile time constant
float a = 1 / sqrt_2pi;
float b = c / sqrt_2pi;
Run Code Online (Sandbox Code Playgroud)

如何更聪明的优化,包括了解数学函数的语义:

float a = 1 / sqrtf(c * M_PI);
float b = c / sqrtf(M_PI);
Run Code Online (Sandbox Code Playgroud)

对此:

float sqrt_pi = sqrtf(M_PI); // Compile time constant
float a = 1 / (sqrt_pi * sqrtf(c));
float b = c / sqrt_pi;
Run Code Online (Sandbox Code Playgroud)

tal*_*ies 8

编译器领先于您.在你的例子中:

float a = 1 / sqrtf(2 * M_PI);
float b = c / sqrtf(2 * M_PI);
Run Code Online (Sandbox Code Playgroud)

nvopencc(Open64)将发出以下信息:

    mov.f32         %f2, 0f40206c99;        // 2.50663
    div.full.f32    %f3, %f1, %f2;
    mov.f32         %f4, 0f3ecc422a;        // 0.398942
Run Code Online (Sandbox Code Playgroud)

这相当于

float b = c / 2.50663f;
float a = 0.398942f;
Run Code Online (Sandbox Code Playgroud)

第二种情况编译成这样:

float a = 1 / sqrtf(c * 3.14159f); // 0f40490fdb
float b = c / 1.77245f; // 0f3fe2dfc5
Run Code Online (Sandbox Code Playgroud)

我猜测a编译器生成的表达式应该比"optmized"版本更准确,但速度大致相同.

  • 引用nvcc文档的第一页:"CUDA编译器驱动程序NVCC".它是一个引导编译的程序,但它使用主机C++编译器,cudafe和cudafe ++(预处理器),nvOpen64和ptxas来实际预处理,编译和汇编GPU的代码. (4认同)
  • 我认为最后的评论是不公平的 - nvidia(以及ATI/AMD)多年来一直在其着色语言SDK和驱动程序中提供高性能编译器.nvopencc使用自己对Open64/gcc前端的修改,使用自己的后端发出PTX虚拟机汇编代码.你可以看到一篇关于他们的Open64端口的文章[这里](http://www.capsl.udel.edu/conferences/open64/2008/). (4认同)