迈克老狼2012 发表于 2012-12-12 00:26:28

OpenCL 学习step by step (3) 存储kernel文件为二进制

OpenCL 学习step by step (3) 存储kernel文件为二进制

<div class="postbody"><div id="cnblogs_post_body">     在教程2中,我们通过函数convertToString,把kernel源文件读到一个string串中,然后用函数clCreateProgramWithSource装入程序对象,再调用函数clBuildProgram编译程序对象。其实我们也可以直接调用二进制kernel文件,这样,当不想把kernel文件给别人看的时候,起到一定的保密作用。在本教程中,我们会把读入的源文件存储一个二进制文件中,并且还会建立一个计时器类,用来记录数组加法在cpu和gpu端分别执行的时间。

     首先我们建立工程文件gclTutorial2,在其中增加类gclFile,该类主要用来读取文本kernel文件,或者读写二进制kernel文件。
class gclFile      
{      
public:      
    gclFile(void);      
    ~gclFile(void);
    //打开opencl kernel源文件(文本模式)      
    bool open(const char* fileName);
    //读写二进制kernel文件      
    bool writeBinaryToFile(const char* fileName, const char* birary, size_t numBytes);      
    bool readBinaryFromFile(const char* fileName);

}
gclFile中三个读写kernel文件的函数代码为:
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">   bool gclFile::writeBinaryToFile(const char* fileName, const char* birary, size_t numBytes)
{
    FILE *output = NULL;
    output = fopen(fileName, "wb");
    if(output == NULL)
      return false;

    fwrite(birary, sizeof(char), numBytes, output);
    fclose(output);

    return true;
}


bool gclFile::readBinaryFromFile(const char* fileName)
{
    FILE * input = NULL;
    size_t size = 0;
    char* binary = NULL;

    input = fopen(fileName, "rb");
    if(input == NULL)
    {
      return false;
    }

    fseek(input, 0L, SEEK_END);
    size = ftell(input);
    //指向文件起始位置
    rewind(input);
    binary = (char*)malloc(size);
    if(binary == NULL)
    {
      return false;
    }
    fread(binary, sizeof(char), size, input);
    fclose(input);
    source_.assign(binary, size);
    free(binary);

    return true;
}

bool gclFile::open(const char* fileName)   //!< file name
{
    size_t      size;
    char*       str;

    //以流方式打开文件
    std::fstream f(fileName, (std::fstream::in | std::fstream::binary));

    // 检查是否打开了文件流
    if (f.is_open())
    {
      size_tsizeFile;
      // 得到文件size
      f.seekg(0, std::fstream::end);
      size = sizeFile = (size_t)f.tellg();
      f.seekg(0, std::fstream::beg);

      str = new char;
      if (!str)
      {
            f.close();
            returnfalse;
      }

      // 读文件
      f.read(str, sizeFile);
      f.close();
      str = '\0';

      source_= str;

      delete[] str;

      return true;
    }

    return false;
}
页: [1]
查看完整版本: OpenCL 学习step by step (3) 存储kernel文件为二进制