OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?
Posted
技术标签:
【中文标题】OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?【英文标题】:How much registers per thread does OpenCL kernel use on Nvidia GPU? 【发布时间】:2012-04-24 22:38:30 【问题描述】:我的第一个问题是如何在 Nvidia GPU 上获取 OpenCL 内核代码的寄存器使用信息,因为 nvcc 编译器使用 nvcc --ptxas-options=-v
标志为 CUDA 内核代码提供了相同的信息。
在导出GPU_DUMP_DEVICE_KERNEL=3
后,我还从运行程序时生成的.isa file
获得了有关用于OpenCL 内核的AMD GPU 的相同信息。我也在 Nvidia GPU 上尝试过同样的事情,但没有得到.isa file
。我的第二个问题是为什么 Nvidia GPU 不生成 .isa file
?
在谷歌搜索后,我发现在 Nvidia GPU 上获取 OpenCL 内核的寄存器和共享内存使用信息的方法是在 clBuildProgram() 函数调用中使用 cl-nv-verbose
字符串标志。然后读取编译内核代码的“二进制”信息。
我的第三个问题是在 Nvidia GPU 上获取寄存器使用信息的正确方法吗?其他的方法是什么?
//正在构建程序...
clBuildProgram(program, 1, &device_id, "-cl-nv-verbose", NULL, NULL);
在构建程序后,我在 clGetProgramInfo() 函数中使用了两个常量 CL_PROGRAM_BINARY_SIZES and CL_PROGRAM_BINARIES
来获取已编译内核代码的二进制文件。
// 打印编译好的内核代码的二进制文件...
cl_uint program_num_devices, ret;
size_t t;
ret = clGetProgramInfo(program, CL_PROGRAM_NUM_DEVICES, sizeof(cl_uint), &program_num_devices, NULL);
if(program_num_devices == 0)
printf("No valid device was found \n");
return ;
size_t binary_sizes[program_num_devices];
char **binaries = (char **) malloc(program_num_devices * sizeof(char* ));
//first call to get size of ISA binary file...
ret = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, program_num_devices * sizeof(size_t), &binary_sizes, NULL);
for(t = 0; t < program_num_devices; t++)
binaries[t] = (char *) malloc((binary_sizes[t] + 1) * sizeof(char));
//second call to get ISA info....
ret = clGetProgramInfo(program, CL_PROGRAM_BINARIES, program_num_devices * sizeof(size_t), binaries, NULL);
for(t = 0; t < program_num_devices; t++)
binaries[t][binary_sizes[t]] = '\0';
printf("Binary ISA Info%s : %lu \n", binaries[t], binary_sizes[t]);
printf("ProgramNumDevices:: %u\n", program_num_devices);
for(t = 0; t < program_num_devices; t++)
free(binaries[t]);
这是打印我编译的 OpenCl 内核代码的“二进制文件”。但它不显示寄存器和共享内存使用信息。为什么?
请分享一些有用的信息。
提前致谢!!!!
【问题讨论】:
【参考方案1】:通过快速搜索,看起来在使用-cl-nv-verbose
构建程序后,您会得到带有clGetProgramBuildInfo(...,CL_PROGRAM_BUILD_LOG,...)
的详细输出。
【讨论】:
我还有一个关于 global_work_size 的问题,因为我们知道 global_work_size 的唯一限制是它必须是 local_work_size 的倍数(对于每个维度)。那么如果 global_work_size 不是 local_work_size 的倍数怎么处理呢? 您可能应该发布另一个关于此的问题。您可以让全局工作大小稍大一些,例如您的最佳本地工作大小的下一个倍数,然后让每个工作项检查它是否超出范围,如果超出则立即返回。以上是关于OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?的主要内容,如果未能解决你的问题,请参考以下文章
可以仅将 AMD gDEBugger 6.0 用于 OpenCL CPU 内核调试吗? NVIDIA GPU 似乎推迟了这一点
为啥我的 OpenCL 内核在 nVidia 驱动程序上失败,而不是 Intel(可能的驱动程序错误)?