3

我的第一个问题是如何在 Nvidia GPU 上获取 OpenCL 内核代码的寄存器使用信息,因为 nvcc 编译器nvcc --ptxas-options=-v为 CUDA 内核代码提供了相同的 using 标志。

我还从.isa file运行程序时生成的 OpenCL 内核的 AMD GPU 上获得了相同的信息,在导出GPU_DUMP_DEVICE_KERNEL=3. 我也在 Nvidia GPU 上尝试过同样的事情,但没有得到.isa file。我的第二个问题是为什么 Nvidia GPU 不生成.isa file

谷歌搜索后,我发现获取 Nvidia GPU 上 OpenCL 内核的寄存器和共享内存使用信息的方法是cl-nv-verbose在 clBuildProgram() 函数调用中使用字符串标志。然后读取编译内核代码的“二进制”信息。我的第三个问题是在 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 内核代码的“二进制文件”。但它不显示寄存器和共享内存使用信息。为什么?

请分享一些有用的信息。

提前致谢 !!!!

4

1 回答 1

4

通过快速搜索,看起来在使用 构建程序之后-cl-nv-verbose,您会获得使用 的详细输出clGetProgramBuildInfo(...,CL_PROGRAM_BUILD_LOG,...)

于 2012-04-12T15:53:05.327 回答