6

我已经看到 AMD APP SDK 示例在只有 Intel CPU 的机器上工作。这怎么可能发生?编译器如何针对不同的机器架构?我不需要英特尔的一组编译器来在英特尔 CPU 上运行代码吗?

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

我的理解哪里错了?

4

3 回答 3

4

首先,OpenCL 是为在 CPU 和 GPU 上工作而构建的。您可以在任一类型的设备上编译和运行相同的源代码。但是,CPU 代码很可能对于 GPU 来说不是最佳的,反之亦然。

AMD H/W 占 x86/x64 CPU 总数的 7% - 14%。因此,AMD 必须为 AMD 和 Intel 芯片开发相关的编译器。AMD 有为这两组芯片开发编译器的历史。相反,英特尔开发的编译器要么不能在 AMD 芯片上工作,要么不能很好地工作。这并不奇怪。

使用 OpenCL,AMD APP SDK 是最灵活的,它将在 AMD 和 Intel CPU 和 AMD GPU 上运行良好。英特尔的 OpenCL SDK 甚至没有安装在 AMD x86 H/W 上。

如果您将 OpenCL 程序编译为二进制文件,您可以保存并重复使用它,只要它与创建它的 OpenCL 平台和设备相匹配。因此,如果您为一台设备编译并在另一台设备上使用,您很可能会出错。

于 2012-08-13T22:29:25.033 回答
0

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

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

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

关于英特尔,我应该说他们最初支持所有 iCore 代甚至一些 C2D,现在新的 SDK 只支持第 3 代 iCore,我不明白他们的策略,如果你可能英特尔是最后的选择想要采用 OpenCL 并瞄准尽可能多的受众,他们的 SDK 似乎也不是很好

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

于 2012-08-12T05:28:45.687 回答
0

底线是 AMD SDK 包含一个针对 OpenCL 的 x86 CPU 的编译器。这意味着即使您运行的是 Intel CPU,生成的代码也会在其上运行。这与编译 C 程序以在 x86 CPU 上运行的概念相同:它适用于 Intel 和 AMD CPU(或任何实现 x86 指令集的 CPU)。

供应商的编译器可能有特定的优化,比如 user827992 提到的,但根据我的经验,在 Intel CPU 上运行时 AMD 的 CPU 编译器的性能并没有那么差。我还没有尝试过英特尔的 OpenCL 实现。

确实,对于某些(也许是未来的大多数)硬件,只有供应商的编译器会支持它。AMD 的 SDK 不会构建将在 NVIDIA 卡上运行的代码,反之亦然。CPU 恰好是一种特殊情况,因为基本指令集部署如此广泛,以至于 CPU 编译器可以在您可能接触到的大多数机器上工作。

于 2012-08-13T11:34:21.487 回答