- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑一个简单的例子:向量加法。
如果我为 CL_DEVICE_TYPE_GPU 构建一个程序,我为 CL_DEVICE_TYPE_CPU 构建相同的程序,它们之间有什么区别(除了“CPU 程序”在 CPU 上运行,而“GPU 程序”在 GPU 上运行)?
谢谢你的帮助。
最佳答案
设备类型之间存在一些差异。您的向量问题的简单答案是:将 gpu 用于大型向量,将 cpu 用于较小的工作负载。
1)内存复制。 GPU 依靠您正在处理的数据传递给它们,然后将结果读回主机。这是通过 PCI-e 完成的,对于 2.0/2.1 版本产生大约 5GB/s 的速度。 CPU 可以使用 CL_MEM_ALLOC_HOST_PTR 或 CL_MEM_USE_HOST_PTR 标志中的任何一个“就地”使用缓冲区 - 在 DDR3 中。见这里:clCreateBuffer .这是许多内核的一大瓶颈。
2) 时钟速度。 cpus 目前在时钟速度上远远领先于 gpus。大多数 cpu 的低端是 2Ghz,而如今大多数 gpus 的高端是 1Ghz。这是真正帮助 cpu 在小型工作负载中“胜过” gpu 的因素之一。
3)并发“线程”。高端 GPU 的计算单元通常比它们的 CPU 对手多。例如,6970 gpu (Cayman) 有 24 个 opencl 计算单元,每个单元又分为 16 个 SIMD 单元。大多数顶级桌面 cpu 有 8 核,而服务器 cpu 目前停止在 16 核。 (cpu 核心 1:1 映射到计算单元计数)opencl 中的计算单元是设备的一部分,它可以完成与设备其余部分不同的工作。
4) 线程类型。 gpus 具有 SIMD 架构,具有许多面向图形的指令。 cpus 有很多专门用于分支预测和一般计算的区域。一个 cpu 可能在每个内核中都有一个 SIMD 单元和/或浮点单元,但我上面提到的 Cayman 芯片有 1536 个单元,每个单元都可以使用 gpu 指令集。 AMD 称它们为流处理器,上面提到的每个 SIMD 单元中都有 4 个(24x16x4 = 1536)。除非制造商想要削减一些高速缓存或分支预测硬件,否则任何 CPU 都不会有那么多 sin(x) 或支持点积的单元。 GPU 的 SIMD 布局可能是大型向量加法情况的最大“胜利”。还可以做其他专门的功能是一个很大的好处。
5) 内存带宽。带 DDR3 的 CPU:~17GB/s。高端 GPU >100GB/s,200GB/s 以上的速度最近变得很普遍。如果您的算法不受 PCI-e 限制(参见 #1),则 gpu 在原始内存访问方面将超过 cpu。 gpu 中的调度单元可以通过仅运行不等待内存访问的任务来进一步隐藏内存延迟。 AMD 称之为波前,Nvidia 称之为扭曲。 cpus 有一个庞大而复杂的缓存系统,可以在程序重用数据的情况下帮助隐藏它们的内存访问时间。对于您的向量添加问题,您可能会受到 PCI-e 总线的更多限制,因为向量通常每个只使用一次或两次。
6) 电源效率。 gpu(使用得当)通常比 cpu 更节能。由于 cpu 在时钟速度方面占主导地位,因此真正降低功耗的唯一方法之一就是降低芯片的时钟频率。这显然会导致更长的计算时间。 Green 500 榜单上的许多顶级系统都采用 GPU 加速。见这里:green500.org
关于OpenCL CPU 设备与 GPU 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9205915/
Intel、AMD 和 Khronos OpenCL 之间有什么区别。我对 OpenCL 完全陌生,想从它开始。我不知道在我的操作系统上安装哪个更好。 最佳答案 OpenCL 是 C 和 C++ 语言
我在这里的一篇文章中看到,我们可以从 OpenCL 内核调用函数。但是在我的情况下,我还需要并行化该复杂函数(由所有可用线程运行),所以我是否必须将该函数也设为内核并像从主内核中调用函数一样直接调
最近我看到一些开发板支持 OpenCL EP,例如 odroid XU。我知道的一件事是 OpenCL EP 适用于 ARM 处理器,但它与基于主要桌面的 OpenCL 在哪些特性上有所不同。 最佳答
我想知道在 OpenCL 中设置为内核函数的参数数量是否有任何限制。设置参数时出现 INVALID_ARG_INDEX 错误。我在内核函数中设置了 9 个参数。请在这方面帮助我。 最佳答案 您可以尝试
我对零拷贝的工作原理有点困惑。 1-要确认以下内容对应于opencl中的零拷贝。 ....................... . . . .
我是 OpenCL 的初学者,我很难理解某些东西。 我想改进主机和设备之间的图像传输。 我制定了一个计划以更好地了解我。 顶部:我现在拥有的 |底部:我想要的 HtD(主机到设备)和 DtH(设备到主
今天我又加了四个 __local变量到我的内核以转储中间结果。但是只需将另外四个变量添加到内核的签名并添加相应的内核参数就会将内核的所有输出呈现为“0”。没有一个 cl 函数返回错误代码。 我进一步尝
我知道工作项被分组到工作组中,并且您不能在工作组之外进行同步。 这是否意味着工作项是并行执行的? 如果是这样,使用 128 个工作项创建 1 个工作组是否可能/有效? 最佳答案 组内的工作项将一起安排
我相当确定经纱仅在 CUDA 中定义。但也许我错了。就 OpenCL 而言,什么是扭曲? 它与工作组不一样,是吗? 任何相关的反馈都受到高度赞赏。谢谢! 最佳答案 它没有在 OpenCL 标准中定义。
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在OpenCL中,我的理解是可以使用barrier()函数来同步工作组中的线程。我(通常)确实了解它们的用途以及何时使用它们。我还知道工作组中的所有线程都必须遇到障碍,否则会出现问题。然而,到目前为止
我的主板上有 Nvidia 显卡 (GeForce GT 640)。我已经在我的盒子上安装了 OpenCL。当我使用“clGetPlatformInfo(参数)”查询平台时,我看到以下输出:-#可用平
我目前正在构建一个 ray marcher 来查看像 mandelbox 等东西。它工作得很好。但是,在我当前的程序中,它使用每个 worker 作为从眼睛转换的光线。这意味着每个 worker 有大
我编写了两个不同的 openCl 内核,使用 nvidia profiler 获取了有关它们的一些信息,发现两者每个工作项都使用 63 个寄存器。 我尝试了一切我能想到的方法来降低这个数字(用 ush
我的主板上有 Nvidia 显卡 (GeForce GT 640)。我已经在我的盒子上安装了 OpenCL。当我使用“clGetPlatformInfo(参数)”查询平台时,我看到以下输出:-#可用平
我目前正在构建一个 ray marcher 来查看像 mandelbox 等东西。它工作得很好。但是,在我当前的程序中,它使用每个 worker 作为从眼睛转换的光线。这意味着每个 worker 有大
我正在尝试使用 OpenCL 加速一些计算,算法的一部分包括矩阵求逆。是否有任何开源库或免费可用的代码来计算用 OpenCL 或 CUDA 编写的矩阵的 lu 分解(lapack dgetrf 和 d
我正在尝试在 OpenCL 内核中使用递归。编译成功,但运行时出现编译错误,所以我想知道,由于 CUDA 现在支持动态并行,OpenCL 是否支持动态并行? 最佳答案 OpenCL 不支持递归。请参阅
考虑以下代码,它从大小为 size 的 double 组创建缓冲区内存对象: coef_mem = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM
OpenCL 中目标平台的示例是什么?例如,它是 Windows、Android、Mac 等操作系统,还是设备中的实际芯片? 最佳答案 OpenCL 平台本质上是一个 OpenCL 实现。它与操作系统
我是一名优秀的程序员,十分优秀!