Optimization 为什么不是';NVRTC优化我的整数除法和模运算?

Optimization 为什么不是';NVRTC优化我的整数除法和模运算?,optimization,cuda,compiler-flags,nvrtc,Optimization,Cuda,Compiler Flags,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次幂除法应该优化为位运算,直到我发现它不是: __glo

我在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\u B
运行得更快。当忽略内核中的所有其他代码时,以1024个大小为1024的块启动,
nvprof
显示
kernel_A
平均运行15.2us,而
kernel_B
平均运行7.4us。我推测NVRTC没有优化整数除法和模

结果是在GeForce 750 Ti、CUDA 8.0上获得的,平均值为100次调用。提供给
nvrtcompiileprogram()
的编译器选项是
-arch compute\u 50


这是预期的吗?

在代码库中进行了彻底的错误清理。原来我的应用程序是在
DEBUG
模式下构建的。这会导致将附加标志
-G
-lineinfo
传递到
nvrtcompileprogram()

nvcc
手册页:

--设备调试
(-G)

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


你不需要猜测。通过
cuobjdump-sass
运行可执行文件以找出原因。@tera我正在通过NVRTC进行JIT编译,因此没有可执行文件。有没有办法转储程序集?NVRTC发出PTX并将其传递给驱动程序进行JIT编译。您可以使用
nvrtcGetPTX
提取PTX。那你就不需要了speculate@talonmies谢谢你的提示,我将尝试进行更多的调查。我认为这两个案例之间不太可能有任何区别。当使用nvcc一路编译到SASS时,在每种情况下生成的代码(PTX和SASS)都是相同的。我认为nvcc source->PTX再加上PTX的JIT->SASS不太可能有任何不同。由于在这个问题中没有给出完整的重编案例,我的猜测是不同之处在于其他地方。