1 个 cpu 设备上 OpenCL 的并行性

Posted

技术标签:

【中文标题】1 个 cpu 设备上 OpenCL 的并行性【英文标题】:Parallelism in OpenCL on 1 cpu device 【发布时间】:2012-03-11 15:25:08 【问题描述】:

是否有可能在 OpenCL 中使用多核 CPU 设备实现与多个异构设备(如 GPU 和 CPU)相同的并行度?

我有一个英特尔 i5 并且正在寻找优化我的代码。当我在平台上查询设备时,我只返回一个设备:CPU。我想知道如何使用它来优化我的代码。

另外,如果我为此设备使用单个命令队列,应用程序会自动将内核分配给不同的计算设备,还是必须由程序员手动完成?

【问题讨论】:

【参考方案1】:

cpu 设备能否达到与 gpu 相同的并行度?几乎总是没有。

gpu 中的计算单元数量几乎总是比 cpu 中的多。例如,50 美元可以为您提供具有 10 个计算单元的视频卡(Radeon 6450)。 newegg 上最便宜的 8 核 cpu 售价为 189 美元(台式机 cpu)和 269 美元(服务器)。

cpu 的计算单元由于时钟速度而运行得更快,并且执行分支代码比 gpu 好得多。如果您的工作负载有很多条件语句,您需要一个 cpu。 gpu 将对许多数据执行相同的指令。 6450 gpu 每个计算单元有 16 个“流处理器”来实现这一点。当您必须多次执行相同(小型/中型)任务时,GPU 非常棒。矩阵乘法、n-boy 计算、归约运算和一些排序算法在 gpu/加速器硬件上比在 cpu 上运行得更好。

几周前我更详细地回答了一个类似的问题。 (This one)

回到您关于“相同级别的并行度”的问题——cpus 的并行度级别与 gpus 不同,除非 gpu 在执行实际内核时处于执行状态。

在您的 i5 系统上,将只有一个 cpu 设备。这代表整个cpu。当您查询计算单元的数量时,opencl 将返回您拥有的核心数量。如果您想使用所有内核,只需在设备上运行内核,opencl 就会为您使用所有计算单元(内核)。

【讨论】:

【参考方案2】:

简短回答:是的,它将并行运行,不,不需要手动执行。

长答案:

另外,如果我为此设备使用单个命令队列,应用程序是否会自动将内核分配给不同的计算设备 [...]

要么您需要修改您的 OpenCL 词汇表,要么我不理解您的问题。您只有一个设备和核心!= 设备!

一个 CPU,不管它有多少内核,都是一个设备。 GPU 也是如此:一个拥有数百个内核的 GPU 只是一个设备。您通过队列和设备的驱动程序将作业发送到设备。您的工作可以(并且将)分成工作项。然后,一些(多少取决于设备/驱动程序)工作项并行执行。在 GPU 和 CPU 上,一个工作项由一个内核执行。 (这可能不完全正确,但它是一个非常有用的抽象。)

如果您将多个内核排入一个队列(不通过等待事件连接它们!),驱动程序可能会或可能不会并行运行它们。

OpenCL 的真正目标是允许您并行计算工作项,无论是并行使用多个设备的内核还是仅使用单个设备的内核。

如果这让您感到困惑,请观看这​​些非常棒(而且很长)的视频:http://macresearch.org/opencl

【讨论】:

【参考方案3】:

您如何确定 OPENCL 设备数量?我有一台配备 2 个 OpenCL 计算单元的 Intel I3 笔记本电脑?它有 2 个核心。

根据 Intel 的规范,I5-2300 有 4 个内核并支持 4 个线程。它不是超线程的。我希望 OpenCL 调用查询 # 设备给你的计数是 4。

【讨论】:

阅读上面的答案,CPU 是一种设备,就像 GPU 是一种设备一样,无论它们拥有多少内核。

以上是关于1 个 cpu 设备上 OpenCL 的并行性的主要内容,如果未能解决你的问题,请参考以下文章

GPU 中的并行性 - CUDA / OpenCL

OpenCL

OpenCL:并行求和n个整数

OpenCL异构并行计算

CPU OpenCL 开源 OneAPI

从零开始学习OpenCL开发架构