我使用NVRTC编译了一个内核:
似乎
结果是在GeForce 750 Ti上获得的,CUDA 8.0,从100次调用中取平均值。给
这符合预期吗?
__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
只是运行得更快。当在kernel中省略所有其他代码,以1024个大小为1024的块启动时,nvprof
显示平均kernel_A
运行15.2us,而kernel_B
平均运行7.4us。我猜测NVRTC没有优化掉整数除法和模数。结果是在GeForce 750 Ti上获得的,CUDA 8.0,从100次调用中取平均值。给
nvrtcCompileProgram()
的编译器选项是-arch compute_50
。这符合预期吗?
cuobjdump -sass
运行可执行文件即可找到答案。 - teranvrtcGetPTX
函数提取PTX代码。这样就不需要猜测了。 - talonmies