我在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
。
这是预期的吗?
答案 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。