我的第一个问题是如何在Nvidia GPU上获取OpenCL内核代码的寄存器使用信息,因为nvcc编译器为CUDA内核代码提供了相同的nvcc --ptxas-options=-v
标志。
在导出.isa file
之后,我还从运行程序时生成的GPU_DUMP_DEVICE_KERNEL=3
获得了有关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内核代码的“二进制文件”。但它没有显示寄存器和共享内存使用的信息。为什么呢?
请分享一些有用的信息。
先谢谢!!!!
答案 0 :(得分:4)
通过快速搜索,看起来在使用-cl-nv-verbose
构建程序后,您可以使用clGetProgramBuildInfo(...,CL_PROGRAM_BUILD_LOG,...)
获得详细输出。