在OpenCL中,是否有可能在多核CPU设备上实现与多个异构设备(如GPU和CPU )相同级别的并行性?
我有一个英特尔的i5,并希望优化我的代码。当我在平台上查询设备时,我只得到一个返回的设备: CPU。我想知道如何使用这个来优化我的代码。
此外,如果我对此设备使用单个命令队列,应用程序是否会自动将内核分配给不同的计算设备,还是必须由程序员手动完成?
发布于 2012-03-12 16:10:46
简短的回答:是的,它将并行运行,不,不需要手动完成。
长长的答案:
此外,如果我对此设备使用单个命令队列,应用程序是否会自动将内核分配给不同的计算设备...
要么你需要修改你的OpenCL词汇表,要么我没听懂你的问题。你只有一个设备和核心!=设备!
一个CPU,不管它有多少个内核,都是一个设备。同样的道理也适用于GPU:一个拥有数百个内核的GPU只是一个设备。您可以通过队列和设备的驱动程序向设备发送作业。您的工作可以(也将)拆分为工作项。然后,并行执行一些(多少取决于设备/驱动程序)工作项。在GPU和CPU上,一个工作项目由一个内核执行。(这可能不是完全正确的,但它是一个非常有用的抽象。)
如果您将多个内核排入一个队列(而不是通过等待事件连接它们!),则驱动程序可能会并行运行它们,也可能不会。
OpenCL的目标就是允许您并行计算工作项,而不管它是并行使用多个设备核心,还是只使用一个设备核心。
如果你对此感到困惑,请观看这些非常好(而且很长)的视频:http://macresearch.org/opencl
发布于 2012-03-16 11:12:02
cpu设备能达到与gpu相同的并行度吗?几乎总是没有。
gpu中的计算单元数量几乎总是多于cpu中的计算单元数量。例如,50美元可以得到一个具有10个计算单元的视频卡(Radeon 6450)。newegg上最便宜的8核cpu售价为189美元(台式机cpu)和269美元(服务器cpu)。
由于时钟速度的原因,cpu的计算单元将运行得更快,并且比gpu更好地执行分支代码。如果你的工作负载有很多条件语句,你需要一个cpu。gpu将对许多数据片段执行相同的指令。为了实现这一点,6450GPU每个计算单元有16个‘流处理器’。当您必须多次执行相同的(小型/中型)任务时,Gpus非常有用。矩阵乘法、n次计算、归约运算和一些排序算法在gpu/加速器硬件上比在cpu上运行得更好。
几周前,我更详细地回答了一个类似的问题。(This one)
回到你关于“相同级别的并行”的问题-- cpus不具有与gpu相同的并行级别,除非gpu在实际内核的执行上执行。
在您的i5系统上,将只有一个cpu设备。这表示整个cpu。当您查询计算单元数量时,opencl将返回您拥有的内核数量。如果您想使用所有内核,只需在您的设备上运行内核,opencl将为您使用所有计算单元(内核)。
发布于 2012-03-14 10:49:30
您如何确定OPENCL设备数量?我有一台带2个OpenCL计算单元的英特尔I3笔记本电脑?它有两个内核。
根据英特尔的规格,I5-2300有4个内核,支持4个线程。它不是超线程的。我期望对查询# devices的OpenCL调用会给出4的计数。
https://stackoverflow.com/questions/9656228
复制相似问题