与OpenCL中的多个异构设备(如GPU和CPU)相比,是否有可能实现与多核CPU设备相同的并行度?
我有一个intel i5,我正在寻找优化我的代码。当我在平台上查询设备时,我只返回了一个设备:CPU。我想知道如何通过使用它来优化我的代码。
此外,如果我为此设备使用单个命令队列,应用程序是否会自动将内核分配给不同的计算设备,还是必须由程序员手动完成?
答案 0 :(得分:1)
cpu设备可以达到与gpu相同的并行度吗?几乎总是没有。
gpu中的计算单元数量几乎总是比cpu中的多。例如,50美元可以为您提供10个计算单元(Radeon 6450)的视频卡。 newegg上最便宜的8核cpus售价为189美元(桌面CPU)和269美元(服务器)。
由于时钟速度,cpu的计算单元将运行得更快,并且执行分支代码比gpu好得多。如果您的工作负载有很多条件语句,您需要一个cpu。 一个gpu将对许多数据执行相同的指令。 6450 gpu每个计算单元有16个“流处理器”来实现这一目标。当您必须多次执行相同(小/中)任务时,Gpus非常棒。矩阵乘法,n-boy计算,约简运算和一些排序算法在gpu /加速器硬件上比在cpu上运行得好得多。
几周前,我回答了一个类似的问题。 (This one)回到关于“相同级别的并行性”的问题 - cpus没有与gpus相同的并行级别,除非在执行实际内核时执行gpu的情况。
在您的i5系统上,只有一个cpu设备。这代表整个cpu。当您查询计算单元的数量时,opencl将返回您拥有的核心数。如果要使用所有内核,只需在设备上运行内核,opencl将为您使用所有计算单元(内核)。
答案 1 :(得分:0)
简短回答:是的,它将并行运行,不需要手动执行。
答案很长:
此外,如果我为此设备使用单个命令队列,应用程序是否会自动将内核分配给不同的计算设备[...]
您需要修改OpenCL词汇表,或者我不理解您的问题。你只有一个设备和核心!=设备!
一个CPU,无论它有多少核,都是一个设备。 GPU也是如此:一个拥有数百个内核的GPU只有一个设备。您通过队列和设备的驱动程序将作业发送到设备。您的工作可以(并将会)分成工作项。然后,一些(多少取决于设备/驱动程序)工作项并行执行。在GPU上以及CPU上,一个内核执行一个工作项。 (这可能不完全正确,但它是一个非常有用的抽象。)
如果你在一个队列中排队几个内核(没有通过等待事件连接它们!),驱动程序可能会也可能不会并行运行它们。
OpenCL的目标是允许您并行计算工作项,无论它是并行使用多个设备的核心还是仅使用单个设备核心。
如果这让您感到困惑,请观看这些非常好(和长)的视频:http://macresearch.org/opencl
答案 2 :(得分:0)
您如何确定OPENCL设备数量?我有一台英特尔I3笔记本电脑,它给了我2个OpenCL计算单元?它有2个核心。
根据英特尔规范,I5-2300有4个内核,支持4个线程。它不是超线程的。我希望OpenCL调用查询#devices可以给你4个计数。