为什么NVRTC

时间:2017-06-01 06:44:37

标签: optimization cuda nvrtc

我在NVRTC中编译了一个内核:

__global__ void kernel_A(/* args */) {
    unsigned short idx = threadIdx.x;
    unsigned char warp_id = idx / 32;
    unsigned char lane_id = idx % 32;
    /* ... */
}

我知道整数除法和模数在CUDA GPU上非常昂贵。但是我认为这种2分频功能应该优化为位操作,直到我发现它不是:

__global__ void kernel_B(/* args */) {
    unsigned short idx = threadIdx.x;
    unsigned char warp_id = idx >> 5;
    unsigned char lane_id = idx & 31;
    /* ... */
}

似乎kernel_B运行得更快。当省略内核中的所有其他代码时,使用1024个大小为1024的块进行启动时,nvprof显示kernel_A平均运行 15.2us ,而kernel_B运行 7.4us 平均。我推测NVRTC没有优化整数除法和模数。

结果是在GeForce 750 Ti,CUDA 8.0上获得的,平均来自100次通话。给nvrtcCompileProgram()的编译器选项是-arch compute_50

这是预期的吗?

1 个答案:

答案 0 :(得分:1)

代码库中是否有彻底的漏洞。原来我的应用程序是在Item Red Green Blue Paul hi there everyone John 5 4 2 Tim 1 3 9 Eric 3.3 5.5 7.5 模式下构建的。这会导致其他标记DEBUG-G传递给-lineinfo

来自nvrtcCompileProgram()手册页:

  

nvcc --device-debug

     

生成设备代码的调试信息。关闭所有优化。          不要用于剖析;请改用-lineinfo。