2012-04-12 103 views
3

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

我也得到了关于AMD GPU for OpenCL内核的相同信息,从.isa file运行该程序时生成的,导出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); 

建设程序后,我用了两个常量CL_PROGRAM_BINARY_SIZES and CL_PROGRAM_BINARIES到clGetProgramInfo()函数来获得编译内核代码的二进制文件。

的遵守内核代码//打印二进制文件...

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内核代码“二进制”。但它不显示寄存器和共享内存使用的信息。为什么?

请分享一些有用的信息。

在此先感谢!!!!

回答

3

从快速搜索,它看起来像与-cl-nv-verbose建设程序后,你会得到详细的输出与clGetProgramBuildInfo(...,CL_PROGRAM_BUILD_LOG,...)

+0

我还有一个关于global_work_size的问题,因为我们知道global_work_size的唯一约束是它必须是local_work_size(对于每个维度)的倍数。那么如果global_work_size不是local_work_size的倍数,该如何处理呢? – Gopal 2012-04-13 14:51:23

+0

您应该发布关于此的另一个问题。您可以使全局工作量更大一些,例如您的最佳本地工作量的下一个倍数,然后让每个工作项检查是否超出范围,如果是,则立即返回。 – 2012-04-13 16:13:27