2012-04-12 48 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