【问题标题】:What types of code domains is OpenCL suited to?OpenCL 适合哪些类型的代码域?
【发布时间】:2012-01-30 15:12:59
【问题描述】:

我阅读了 OpenCL 概述,它指出它适用于运行 CPU、GPGPU、DSP 等的代码。但是,通过查看命令参考,它似乎都是数学和图像类型的操作。我没有看到任何说字符串。

这让我想知道您通过 OpenCL 在 CPU 上运行什么?

此外,我知道 OpenCL 可用于在 GPGPU 上执行排序。但是有人会使用它(或者,目前的 GPGPU)来执行字符串处理,例如模式匹配、变音位提取、字典查找或其他任何需要处理字符串数组的事情吗?

编辑 我注意到英特尔即将推出的 Ivy Bridge 在其图形单元方面被吹捧为“兼容 OpenCL”。这是推断 CPU 内核不兼容 OpenCL,还是没有这样的推断?

编辑 为了非辩论和建设性的利益,如果有人能指出我的官方参考资料来回答我的问题,我将不胜感激。

【问题讨论】:

  • 谁在说 Intel 的 Ivy Bridge GPU “符合 OpenCL”,“符合 OpenCL”是什么意思?英特尔 CPU 使用英特尔 OpenCL SDK 支持 OpenCL。

标签: cpu opencl parallel-processing gpgpu heterogeneous


【解决方案1】:

您可以将 OpenCL 视为运行时(用于设备发现、排队)和基于 C 的编程语言的组合。这种编程语言具有原生向量类型和内置函数和操作,可以对这些向量进行各种有趣的操作。这很好,因为您可以在 OpenCL 中编写一个矢量化内核,并且它有责任将其映射到您硬件的实际矢量 ISA。

从这个 4/2011 article,它可能会消失:

目前有两种主要的 CPU 架构,x86 和 ARM,两者都是 应该很快就会运行 OpenCL 代码。

如果您编写一个针对这两种架构的 OpenCL 应用程序,您就不必担心编写两个版本,一个 SSE 和一个 NEON。只需编写 OpenCL C 并完成它。是的,我知道。这假设供应商已经完成了他的工作并编写了一个充分利用底层 ISA 的可靠实现。但如果他不这样做,请抱怨!

此外,一些 CL 实现提供标量内核的自动矢量化,这通常更容易编写。一个好的自动矢量化器可以毫不费力地为您提供可靠的性能提升。由于 CL 内核是“在线编译”的,因此获得这样的好处不需要交付重新构建的代码。

【讨论】:

    【解决方案2】:

    没有链接,但我认为这是因为使用字符串的算法可能会进行大量动态内存分配和分支,而 GPGPU 并不适合这两种情况。 GPGPU 与矢量处理也有很多共同点,因此使用不同大小的内存块(通常使用字符串算法,您通常没有同质的字符串组)进行工作单元会产生较差的性能并且是很难编程。

    GPU 被设计为在同质数据组(例如每向量或每像素操作)上执行相同的工作,几乎没有分支。可以模仿这种行为的算法在 GPU 上非常有用。

    【讨论】:

    • 这是有道理的。你知道在 CPU 上运行什么 OpenCL 代码吗?这对我来说似乎是一个不切实际的想法。
    • 我使用 GPGPU 的经验通常是使用 CUDA。不过,根据我的理解,OpenCL 只是试图提供一个平台,使编写多线程代码变得容易,而不管架构如何。出于我在帖子中所述的原因,一些多线程应用程序,例如创建动态内容页面的 Web 服务器算法,可能不适合 GPGPU。虽然我不知道 OpenCL 目前针对的是什么类型的项目。
    • OpenCL 不是一种执行多线程的方法。 OpenCL 的工作项都应该对不同的数据进行相同的计算,但不能通信,而且它们可能不会同时运行。
    • @SteveBlackwell 也许多线程是一个错误的词,因为它可能意味着传统的 CPU 线程模型。根据我对 OpenCL 的了解,它复制了许多 CUDA 的线程模型,以及每个任务在内核中的单独线程上运行的想法,这就是我的意思。我可以说它执行多处理更准确,但我个人认为这很令人困惑,因为 CUDA 将工作单元称为线程。据我了解,OpenCL“工作项”与 CUDA 线程完全相同。
    • @SteveBlackwell 在 CUDA 中,同步所有线程没有全局障碍。您可以同步一个块中的所有线程,这将同步在同一处理器上运行的所有线程(即在一个块上运行的线程都在 GPU 上的同一个核心上运行)。但是,同步内核中的所有线程是不可能的,除非您退出内核并在外部同步,这在 OpenCL 中也是可能的。此外,动态内存分配是 CUDA 中相对较新的功能,未来可能会在 OpenCL 中实现,尽管在这两个平台上都会导致性能不佳。
    【解决方案3】:

    这让我想知道你会通过 OpenCL 在 CPU 上运行什么?

    我更喜欢使用 ocl 将工作从 cpu 卸载到我的图形硬件。有时我的显卡有限制,所以我喜欢有一个备用内核供 cpu 使用。此类限制可能是内存大小、内存瓶颈、低时钟速度或 pci-e 总线阻碍。

    我说我喜欢为 cpu 使用单独的内核,因为我认为应该调整所有内核以在其目标硬件上运行。我什至喜欢有一个 openmp 备份计划,因为我使用的大多数算法都会提前以这种方式进行测试。

    我认为最好在 cpu 上测试 gpu 内核以确保它按预期运行。如果您的软件用户安装了 opencl,但只安装了一个 cpu(或低端 gpu),那么能够在不同的设备上执行相同的代码真是太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-22
      • 2011-09-21
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多