OpenCL在1 cpu设备上的并行性

OpenCL在1 cpu设备上的并行性,opencl,parallel-processing,Opencl,Parallel Processing,在OpenCL中,使用多核CPU设备是否可以实现与多个异构设备(如GPU和CPU)相同级别的并行性 我有一个英特尔i5,并期待优化我的代码。当我查询平台上的设备时,只返回一个设备:CPU。我想知道如何使用这个优化我的代码 另外,如果我对这个设备使用单个命令队列,应用程序会自动将内核分配给不同的计算设备,还是必须由程序员手动完成?简短回答:是,它将并行运行,否,不需要手动执行 长答覆: 另外,如果我对这个设备使用单个命令队列,应用程序会自动将内核分配给不同的计算设备吗[…] 要么你需要修改你的Op

在OpenCL中,使用多核CPU设备是否可以实现与多个异构设备(如GPU和CPU)相同级别的并行性

我有一个英特尔i5,并期待优化我的代码。当我查询平台上的设备时,只返回一个设备:CPU。我想知道如何使用这个优化我的代码


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

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

长答覆:

另外,如果我对这个设备使用单个命令队列,应用程序会自动将内核分配给不同的计算设备吗[…]

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

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

如果将多个内核放入一个队列中(而不通过等待事件连接它们!),则驱动程序可能并行运行,也可能不并行运行

OpenCL的目标就是允许您并行计算工作项,而不管它是并行使用多个设备的核心还是仅使用单个设备的核心


如果您对此感到困惑,请观看这些非常好(而且很长)的视频:

您如何确定OPENCL设备数量?我有一台英特尔I3笔记本电脑,可以给我2个OpenCL计算单元?它有两个核心


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

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上好得多

几周前,我更详细地回答了一个类似的问题

回到你关于“相同级别的并行性”的问题——CPU没有与gpu相同级别的并行性,除非gpu在执行实际内核时执行不足


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

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