【问题标题】:How to compile 'OpenCL-program' faster?如何更快地编译“OpenCL 程序”?
【发布时间】:2014-10-12 21:23:57
【问题描述】:

我在这里有两个相关的问题,所以我作为一个问题提出:

1- 我们在运行时使用

编译 opencl 程序
clCreateProgramWithSource(context, 1,  (const char**)&source, NULL, NULL);
clBuildProgram(program, 1, &device, NULL, NULL,
NULL);

我的问题是每次我的 opencl 应用程序运行时都会进行编译,这可能需要相当长的时间。有没有办法让编译第一次发生,并且在随后的应用程序运行中,它使用之前编译的二进制文件?

2- 使用clBuildProgram() 加速编译的不同方法有哪些?可能正在使用编译器标志或其他东西?

【问题讨论】:

  • 您可以将源文件拆分为多个文件并分别构建。
  • 你的内核中有嵌套循环吗? OpenCL 编译器往往会因为试图展开深度嵌套的循环而发疯。您可以尝试限制展开(stackoverflow.com/a/23206339/3182664 上的一些信息,但也可能在其他地方)。到目前为止,这只是一个猜测......
  • 除了预编译之外可能没有其他技术:stackoverflow.com/questions/23601058/…

标签: opencl


【解决方案1】:

牺牲便携性,可以使用clCreateProgramWithBinary

要保存已编译的 OpenCL 代码以在同一设备上运行,您需要执行以下操作:

  • 使用clCreateProgramWithSource编译代码
  • 使用clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, //...)获取二进制的大小
  • 使用clGetProgramInfo(program, CL_PROGRAM_BINARIES, //...) 将二进制文件写入char 缓冲区。
  • 将缓冲区写入磁盘。

那么以后,你可以使用clCreateProgramWithBinary,而不是从源代码编译。

this code 中有一个关于如何完成所有这些操作的示例。您可以根据自己的需要对其进行修剪。

正如the comments 中提到的(感谢@Dithermaster)并重申我的第一点,编译的二进制文件非常特定于编译它的系统。如果系统有任何变化,必须编译一个新的二进制文件。

【讨论】:

  • 我想自动化这个。所以我第一次做clCreateProgramWithSource的东西,当程序再次运行时,它会自动使用clCreateProgramWithBinary。因此最终客户不必查看代码。
  • 您可以通过多种方式实现这一目标。例如,一个简单的想法是检查文件是否存在,如果存在,则使用它。或者,您可以使用命令行开关来指定二进制输入/输出。
  • 只有在平台名称、平台版本、设备名称和设备版本都相同的情况下才应该使用二进制文件。换句话说,如果用户更新了他们的驱动程序,您将需要从源代码重新编译(然后保存新的二进制文件以供后续运行)。
  • 最小可运行示例stackoverflow.com/questions/7338718/…
猜你喜欢
  • 2020-01-24
  • 2013-01-10
  • 2011-10-24
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多