【问题标题】:Can I compile OpenCL code into ordinary, OpenCL-free binaries?我可以将 OpenCL 代码编译成普通的、无 OpenCL 的二进制文件吗?
【发布时间】:2012-01-09 08:47:30
【问题描述】:

我正在为我的目的评估 OpenCL。我突然想到,你不能假设它在 Windows 或 Mac 上开箱即用,因为:

  • Windows 需要一个 OpenCL 驱动程序(当然可以安装)
  • MacOS 仅在 MacOS >= 10.6 上支持 OpenCL

所以我必须分别编写 FPU/SSE/AVX 代码和 OpenCL 以生成两个二进制文件:一个不支持 OpenCL,一个支持 OpenCL。

如果我可以在编译时将 OpenCL 编译成 SSE/AVX,然后在其中发布一个二进制 OpenCL,那就更好了。这样我就不需要为 FPU/SSE/AVX 单独实现了!

有办法吗?

干杯, - 克莱门斯

【问题讨论】:

    标签: compilation inline opencl sse avx


    【解决方案1】:

    实现此目的的一种方法是在您的开发机器上安装英特尔 OpenCL SDK,并使用包含的 OpenCL 离线编译器工具为您的 OpenCL 内核生成汇编代码,并将该汇编代码直接编译/链接到您的应用程序。但是,为了手动调用生成的汇编代码,找出正确的调用约定等可能需要一些工作,然后您将自己负责将您的工作分成多个线程。

    因此,尽管这不是您一直要求的,但至少在 Windows 上,使用 intelocl.dll 及其依赖项(如果许可证允许;我没有检查)可能更容易发布您的应用程序,动态加载从那里获得 OpenCL 函数入口点,将您的 OpenCL 内核即时编译为程序集,然后使用 OpenCL 运行时执行它。

    【讨论】:

    • 嗯,这听起来太复杂了...我认为只是用自己的 C/C++ 代码替换 OpenCL-Library 函数...
    • 重新实现供应商的 OpenCL 实现,即使只是部分实现且没有包含的编译器,也可能需要大量的工作。我想你最好简单地重新分发你依赖的 OpenCL 运行时,类似于我上面的建议。
    • mh,不确定,但 openCL 代码对我来说看起来是 C 兼容的,所以需要一点预处理器魔法......?我仍然不明白如果将其限制为单线程标量代码会有什么大问题......不是吗?!
    • OpenCL 有相当多的(向量)数据类型和 C/C++ 所没有的关键字。但是,如果您对单线程代码就足够了(相当大的)限制,那么您的问题归结为从高级语言创建 SIMD 代码。在这种情况下,请使用良好的自动矢量化编译器(如英特尔编译器)或类似 IPP 的库,该库带有针对不同 CPU 的算法的最佳代码路径。
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多