zoukankan      html  css  js  c++  java
  • GPGPU OpenCL 获取kernel函数编译信息

      使用OpenCL编程时,kernel写成一个单独的文件或者将文件内容保存在一个string中。可以使用clBuildProgram对kernel进行编译链接(compiles & links),如果失败,可以使用clGetProgramBuildInfo获取OpenCL编译器对kernel的编译信息。

    1.clBuildProgram 

     cl_int clBuildProgram (

        cl_program program,  //program
        cl_uint num_devices,  //the number of device
        const cl_device_id *device_list,   //devices id
        const char *options,  //the option of compiler
        void (CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),  //the callback function
        void *user_data)  //the data of callback function
      )

    2.clGetProgramBuildInfo

      cl_int clGetProgramBuildInfo (

        cl_program program,   //program
        cl_device_id device,  //the id of device
        cl_program_build_info param_name,
        size_t param_value_size,
        void *param_value,
        size_t *param_value_size_ret
      )

    3.代码实例(获取编译器对kernel的编译信息)

    3.1 kernel(build_info_kernel.cl)

     1 __kernel void good(__global float *a,
     2                    __global float *b,
     3                    __global float *c) {
     4    
     5     *c = *a + *b;
     6 }
     7 
     8 __kernel void good(__global float *a,
     9                    __global float *b,
    10                    __global float *c) {
    11     __local int var=3;   
    12     int size=get_local_sze(0);
    13     *c = *a + *b;
    14 }

     3.2 tool.h

     1 #ifndef TOOLH
     2 #define TOOLH
     3 #include <CL/cl.h>
     4 #include <string.h>
     5 #include <stdio.h>
     6 #include <stdlib.h>
     7 #include <iostream>
     8 #include <string>
     9 #include <fstream>
    10 using namespace std;
    11 
    12 /** convert the kernel file into a string */
    13 int convertToString(const char *filename, std::string& s);
    14 
    15 /**Getting platforms and choose an available one.*/
    16 int getPlatform(cl_platform_id &platform);
    17 
    18 /**Step 2:Query the platform and choose the first GPU device if has one.*/
    19 cl_device_id *getCl_device_id(cl_platform_id &platform);
    20 
    21 /**获取编译program出错时,编译器的出错信息*/
    22 int getProgramBuildInfo(cl_program program,cl_device_id device);
    23 #endif
    View Code

        tool.cpp

     1 #include <CL/cl.h>
     2 #include <string.h>
     3 #include <stdio.h>
     4 #include <stdlib.h>
     5 #include <iostream>
     6 #include <string>
     7 #include <fstream>
     8 #include "tool.h"
     9 using namespace std;
    10 
    11 /** convert the kernel file into a string */
    12 int convertToString(const char *filename, std::string& s)
    13 {
    14     size_t size;
    15     char*  str;
    16     std::fstream f(filename, (std::fstream::in | std::fstream::binary));
    17 
    18     if(f.is_open())
    19     {
    20         size_t fileSize;
    21         f.seekg(0, std::fstream::end);
    22         size = fileSize = (size_t)f.tellg();
    23         f.seekg(0, std::fstream::beg);
    24         str = new char[size+1];
    25         if(!str)
    26         {
    27             f.close();
    28             return 0;
    29         }
    30 
    31         f.read(str, fileSize);
    32         f.close();
    33         str[size] = '';
    34         s = str;
    35         delete[] str;
    36         return 0;
    37     }
    38     cout<<"Error: failed to open file
    :"<<filename<<endl;
    39     return -1;
    40 }
    41 
    42 /**Getting platforms and choose an available one.*/
    43 int getPlatform(cl_platform_id &platform)
    44 {
    45     platform = NULL;//the chosen platform
    46 
    47     cl_uint numPlatforms;//the NO. of platforms
    48     cl_int    status = clGetPlatformIDs(0, NULL, &numPlatforms);
    49     if (status != CL_SUCCESS)
    50     {
    51         cout<<"Error: Getting platforms!"<<endl;
    52         return -1;
    53     }
    54 
    55     /**For clarity, choose the first available platform. */
    56     if(numPlatforms > 0)
    57     {
    58         cl_platform_id* platforms =
    59             (cl_platform_id* )malloc(numPlatforms* sizeof(cl_platform_id));
    60         status = clGetPlatformIDs(numPlatforms, platforms, NULL);
    61         platform = platforms[0];
    62         free(platforms);
    63     }
    64     else
    65         return -1;
    66 }
    67 
    68 /**Step 2:Query the platform and choose the GPU device*/
    69 cl_device_id *getCl_device_id(cl_platform_id &platform)
    70 {
    71     cl_uint numDevices = 0;
    72     cl_device_id *devices=NULL;
    73     cl_int    status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);
    74     if (numDevices > 0) //GPU available.
    75     {
    76         devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
    77         status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
    78     }
    79     return devices;
    80 }
    81 
    82 /**获取编译program出错时,编译器的出错信息*/
    83 int getProgramBuildInfo(cl_program program,cl_device_id device)
    84 {
    85     size_t log_size;
    86     char *program_log;
    87     /* Find size of log and print to std output */
    88     clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 
    89             0, NULL, &log_size);
    90     program_log = (char*) malloc(log_size+1);
    91     program_log[log_size] = '';
    92     clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 
    93             log_size+1, program_log, NULL);
    94     printf("%s
    ", program_log);
    95     free(program_log);
    96     return 0;
    97 }
    View Code

    3.3 buildInfo.cpp

     1 #include "tool.h"
     2 #include <string.h>
     3 #include <stdio.h>
     4 #include <stdlib.h>
     5 #include <iostream>
     6 #include <string>
     7 #include <fstream>
     8 using namespace std;
     9 
    10 void CL_CALLBACK checkData(cl_program platform, void* data){
    11     printf("%s
    ",(char*)data);
    12 }
    13 
    14 int main(int argc, char* argv[])
    15 {
    16     cl_int    status;
    17     /** Getting platforms and choose an available one(first).*/
    18     cl_platform_id platform;
    19     getPlatform(platform);
    20 
    21     /**Query the platform and choose the GPU device.*/
    22     cl_device_id *devices=getCl_device_id(platform);
    23 
    24     /**Create context use the frist device.*/
    25     cl_context context = clCreateContext(NULL,1, devices,NULL,NULL,NULL);
    26 
    27     /**Create program object */
    28     const char *filename = "build_info_kernel.cl";
    29     string sourceStr;
    30     status = convertToString(filename, sourceStr);
    31     const char *source = sourceStr.c_str();
    32     size_t sourceSize[] = {strlen(source)};
    33     cl_program program = clCreateProgramWithSource(context, 1, &source, sourceSize, NULL);
    34 
    35     /**Build program. */
    36     //status=clBuildProgram(program, 1,devices,NULL,checkData,"sdf");
    37     status=clBuildProgram(program, 1,devices,NULL,NULL,NULL);
    38     if(status < 0)    //get the build info
    39         getProgramBuildInfo(program ,devices[0]);
    40     else
    41         printf("Build Success
    ");
    42     
    43     status = clReleaseProgram(program);    //Release the program object.
    44     status = clReleaseContext(context);//Release context.
    45     free(devices);
    46 
    47     getchar();
    48     return 0;
    49 }
    View Code

    对kernel的编译结果:

     

  • 相关阅读:
    把时间转换成你要的格式
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    .NET(C#) win Form窗體常用設置
    合并两个DataTable
    truncate,delete,drop的异同点
    两个关于.NET读取EXCEL文件的问题,记下来,很有用!
    RCP之病人信息系统开发总结(8):MVC模式之View层—操作
    RCP之病人信息系统开发总结(9):MVC模式之View层—对话框
    RCP之病人信息系统开发总结(12):部署RCP应用程序
    RCP之病人信息系统开发总结(10):MVC模式之View层—首选项
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/3642234.html
Copyright © 2011-2022 走看看