英特尔上的AMD APP OpenCL SDK

6

我发现AMD APP SDK示例可以在只有英特尔CPU的机器上运行。这是如何实现的?编译器如何针对不同的机器架构进行目标编译?我不需要使用英特尔的编译器来在英特尔CPU上运行代码吗?

我认为,如果我们要在特定硬件上运行OpenCL应用程序,则必须使用设备供应商的特定编译器进行(重新)编译。

我的理解哪里出了问题?


好的,不要太高兴,APP SDK中的CPU编译器相当糟糕,几乎比官方的Intel OpenCL编译器慢了8倍。因此,它基本上只是一个通用编译器。 - Thomas
3个回答

4
首先,OpenCL被设计用于在CPU和GPU上运行。您可以编译并在任何一种设备上运行相同的源代码。然而,CPU代码很可能对GPU不太优化,反之亦然。
AMD硬件占总x86/x64 CPU的7%-14%。因此,AMD必须为AMD和英特尔芯片开发编译器才能保持相关性。AMD有为两组芯片开发编译器的历史。相反,英特尔开发的编译器要么不能在AMD芯片上工作,要么效果不佳。这并不奇怪。
使用OpenCL时,AMD APP SDK是最灵活的,它可以在AMD和英特尔CPU以及AMD GPU上很好地工作。英特尔的OpenCL SDK甚至无法安装在AMD x86硬件上。
如果将OpenCL程序编译为二进制文件,则只要与创建它的OpenCL平台和设备匹配,就可以保存和重复使用它。因此,如果您为一个设备进行编译并在另一个设备上使用,则很可能会出现错误。

0

OpenCL 的强大之处在于抽象底层硬件并提供大规模、并行和异构计算能力。

一些 SDK 和平台提供了一些特定的功能来“优化”代码,但我认为这些功能只是营销手段,它们引入样板代码,使应用程序不太可移植。

还有一些伪新技术,它们只是 OpenCL 的包装器,或者在概念上非常相似,比如 Intel 快速同步

关于 Intel,我必须说,起初他们支持所有 iCore 代和一些 C2D,现在新的 SDK 只支持第三代 iCore,我真的不明白他们的策略,可能 Intel 是最后的选择,如果你想采用 OpenCL 并面向尽可能广泛的受众,同时 他们的 SDK 看起来并不是很好

坚持标准,您将避免可能的法律和性能问题,您的代码也将更具可移植性。


我同意我尝试过英特尔OpenCL样例,它们更像是DirectX样例而不是OpenCL样例,但是你应该也可以在AMD硬件或Nvidia硬件上运行英特尔的样例。 - kiranputtur

0
底线是,AMD SDK 包括一个针对 OpenCL 的 x86 CPU 的编译器。这意味着即使您正在运行 Intel CPU,生成的代码也可以在上面运行。它与将 C 程序编译为在 x86 CPU 上运行的概念相同:它适用于 Intel 和 AMD CPU(或任何实现 x86 指令集的 CPU)。
供应商的编译器可能具有特定的优化,就像 user827992 提到的那样,但根据我的经验,AMD 的 CPU 编译器在运行 Intel CPU 时性能并不差。我没有尝试过 Intel 的 OpenCL 实现。
的确,对于一些硬件(也许在未来大多数情况下),只有供应商的编译器才支持它。 AMD 的 SDK 将不会构建可在 NVIDIA 卡上运行的代码,反之亦然。 CPU 在某种程度上是一个特殊情况,因为基本指令集如此广泛部署,以至于 CPU 编译器适用于您可能遇到的大多数机器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接