【问题标题】:how to create do offline compilation in opencl and create its binary?如何在opencl中创建离线编译并创建其二进制文件?
【发布时间】:2014-05-12 04:29:29
【问题描述】:

在OpenCl的在线编译中,我们要做...

program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret);

但是,对于opencl的离线创建程序..

program = clCreateProgramWithBinary(context, 1, &device_id, (const size_t *)&binary_size, (const unsigned char **)&binary_buf, &binary_status, &ret);

binary_buf 在哪里...

fread(binary_buf, 1, MAX_BINARY_SIZE, fp);

因此在离线编译中,我们可以跳过 clBuildProgram 步骤,这样可以加快这一步。 (这种方法是否正确,我们可以一次又一次地重复使用该二进制文件来运行程序?)

那么,我的问题是如何创建opencl二进制文件,这样我就可以跳过构建cl程序的步骤了?

【问题讨论】:

  • 你仍然需要调用clBuildProgram(),即使是使用clCreateProgramWithBinary()创建的程序。
  • @KyleLutz 我的 clBuildProgram 需要很多时间,因为我的 cl 文件很大。要跳过这个编译,我想到了离线编译??每次我调用程序时,有没有其他方法可以消除对 clBuildProgram 的重新调用??

标签: opencl


【解决方案1】:

创建程序后,您可以使用clGetProgramInfoCL_PROGRAM_BINARY_SIZES,然后使用CL_PROGRAM_BINARIES,将生成的二进制程序(上下文的每个设备一个)存储到您提供的缓冲区中。然后,您可以将此二进制数据保存到磁盘以供以后运行。

并非所有设备都可能支持二进制文件,因此您需要检查CL_PROGRAM_BINARY_SIZES 结果(如果不支持二进制文件,它将为该设备返回零大小)。

为了在将来节省时间(比如在以后运行您的应用程序时),您可以将clCreateProgramWithBinary 与返回的二进制文件一起使用。但是,您只会希望使用完全相同的硬件来执行此操作。即使图形驱动程序针对相同硬件发生更改,您也可能希望丢弃二进制文件并重新构建,因为新驱动程序中的 OpenCL 编译器可能会修复错误和/或改进性能。

【讨论】:

  • 谢谢@prunge 但是,不是用 clCreateProgramWithBinary 创建二进制文件,而是我仍然需要调用 clBuildProgram ...?因为我的程序非常大(~10-12MB),跨 32 个工作组线程化。每次 clBuildProgram 都需要花费大量时间进行编译。如果在使用 clCreateProgramWithBinary 之后,我仍然需要执行 clBuildProgram 那么我该如何跳过呢?
  • @Vishwadeep 如果您使用从二进制构建的cl_program 调用clBuildProgram,它应该会减少构建时间,因为不需要重新编译二进制文件。将 clBuildProgram 与源代码一起使用与 clBuildProgram 与现成的二进制文件在时间上有何区别?
  • 感谢@prunge 的帮助,我会回复您的统计数据。
  • 最小可运行示例stackoverflow.com/questions/7338718/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2022-10-25
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
相关资源
最近更新 更多