Linux 跨操作系统设置OpenCL环境

Linux 跨操作系统设置OpenCL环境,linux,windows,macos,opencl,Linux,Windows,Macos,Opencl,我们有一个相当大的代码库,由24名程序员在linux、windows和mac上编写。我们正在添加一些opencl代码(最初的目标是intel haswell),并正在寻找如何在对团队造成最小干扰的情况下实现这一点的想法。我们如何安排事情,使它们都能根据正确的opencl头和库愉快地编译?换句话说,对于他们的环境,我们可以安全地假设什么,以允许我们为每个人建立开箱即用的代码库?可以做很多事情,但我写下了一个标准: 创建opencl内核在不同操作系统之间的离线标准可移植中间表示(SPIR)并分发。S

我们有一个相当大的代码库,由24名程序员在linux、windows和mac上编写。我们正在添加一些opencl代码(最初的目标是intel haswell),并正在寻找如何在对团队造成最小干扰的情况下实现这一点的想法。我们如何安排事情,使它们都能根据正确的opencl头和库愉快地编译?换句话说,对于他们的环境,我们可以安全地假设什么,以允许我们为每个人建立开箱即用的代码库?

可以做很多事情,但我写下了一个标准:

创建opencl内核在不同操作系统之间的离线标准可移植中间表示(SPIR)并分发。SPIR的主要目标是使应用程序开发人员能够避免以源代码形式交付内核,同时保持供应商和设备之间的可移植性

有关更多详细信息,请参阅:

可以做很多事情,但我写下了一个标准的:

创建opencl内核在不同操作系统之间的离线标准可移植中间表示(SPIR)并分发。SPIR的主要目标是使应用程序开发人员能够避免以源代码形式交付内核,同时保持供应商和设备之间的可移植性

有关更多详细信息,请参阅:

在不同的操作系统上安装OpenCL有很多不同之处。处理它的最好方法是从跨平台构建系统开始——我个人使用CMake。CMake的最新版本包括一个用于查找头和库的模块,因此理论上您不需要做任何特殊的事情。然而,根据我的经验,该模块编写得不够好,无法支持所有可能的SDK和OSs。我不得不添加更多的位置来查找相关文件

一旦找到了头文件和库,您就需要将opencl.lib包含到构建中,您应该能够通过选择的构建系统以独立于平台的方式完成这项工作

最后一部分是如何在代码中包含标题。基本上,cl.h在Windows和Linux与OS X上的位置是有区别的。如果你看任何OpenCL示例,你就会明白我的意思。您需要有一些ifdef,我建议您将其隔离到自己的include文件中

您还需要决定如何处理内核。对于任何大小合适的内核,您都希望将源代码保存在一个单独的文件中。我将内核保存在.cl文件中,然后使用STRINGIFY宏将CPP代码中的源代码直接包含到字符串变量中


我希望这能给你足够的开始时间。

在不同的操作系统上安装OpenCL有很多不同之处。处理它的最好方法是从跨平台构建系统开始——我个人使用CMake。CMake的最新版本包括一个用于查找头和库的模块,因此理论上您不需要做任何特殊的事情。然而,根据我的经验,该模块编写得不够好,无法支持所有可能的SDK和OSs。我不得不添加更多的位置来查找相关文件

一旦找到了头文件和库,您就需要将opencl.lib包含到构建中,您应该能够通过选择的构建系统以独立于平台的方式完成这项工作

最后一部分是如何在代码中包含标题。基本上,cl.h在Windows和Linux与OS X上的位置是有区别的。如果你看任何OpenCL示例,你就会明白我的意思。您需要有一些ifdef,我建议您将其隔离到自己的include文件中

您还需要决定如何处理内核。对于任何大小合适的内核,您都希望将源代码保存在一个单独的文件中。我将内核保存在.cl文件中,然后使用STRINGIFY宏将CPP代码中的源代码直接包含到字符串变量中


我希望这能给你足够的开始时间。

啊。。我又读了一遍你的问题!!我的答案与不同的GPU供应商(英特尔amd nvidia)更相关。。我在此道歉没问题:我下一步要搬到SPIR!不幸的是,NVIDIA不支持SPIR.ah。。我又读了一遍你的问题!!我的答案与不同的GPU供应商(英特尔amd nvidia)更相关。。我在此道歉没问题:我下一步要搬到SPIR!不幸的是,NVIDIA不支持SPIR。