- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不太明白 OpenCL 中工作组的目的。
我知道它们是一组并行执行的工作项(据说是硬件线程)。
但是,为什么需要更粗的分割?只有线程网格(事实上,只有一个 W-G)不是可以吗?
工作组是否应该准确映射到物理核心?例如,据说 TESLA c1060 卡有 240 个内核。工作组将如何映射到此?
此外,据我所知,由于内存栅栏,工作组内的工作项可以同步。工作组可以同步还是甚至需要?他们是通过共享内存相互交谈还是仅针对工作项目(不确定这一点)?
最佳答案
我认为这里的部分困惑归结为术语。 GPU 人常说的核心,并不是真的,GPU 人常说的线程只是某种意义上的。
磁芯
在 GPU 营销术语中,内核可能指 CPU 内核之类的东西,也可能指 SIMD 单元的单 channel - 实际上,单核 x86 CPU 将是这种更简单类型的四个内核。这就是 GPU 核心数可以如此之高的原因。这不是一个真正的公平比较,你必须除以 16、32 或类似的数字才能获得更直接可比的核心数。
工作项目
OpenCL 中的每个工作项在其控制流和内存模型方面都是一个线程。硬件可以在单个线程上运行多个工作项,您可以通过想象四个 OpenCL 工作项在 SSE 向量的不同 channel 上运行来轻松想象这一点。实现这一点的只是编译器技巧,而在 GPU 上,它往往是编译器技巧和硬件辅助的混合体。 OpenCL 2.0 实际上通过子组公开了这个底层硬件线程概念,因此还有另一个层次结构需要处理。
工作组
每个工作组都包含一组工作项,这些工作项必须能够在存在障碍的情况下取得进展。实际上,这意味着它是一个集合,其所有状态都能够同时存在,这样当遇到同步原语时,它们之间的切换开销很小,并且可以保证切换是可能的。
工作组必须映射到单个计算单元,这实际上意味着整个工作组适合单个实体,CPU 人们将其称为核心 - CUDA 将其称为多处理器(取决于世代),AMD 称为计算单元和其他人有不同的名字。这种执行的局部性导致更有效的同步,但这也意味着工作项集可以访问本地构造的内存单元。它们应该经常通信,否则不会使用屏障,并且为了使这种通信有效,可能会有本地缓存(类似于 CPU L1)或暂存器内存(OpenCL 中的本地内存)。
只要使用屏障,工作组就可以在内部、工作项之间、使用本地内存或使用全局内存进行同步。工作组不能相互同步,并且标准不保证工作组相对于彼此的前进进度,这使得有效地构建可移植的锁定和同步原语变得不可能。
这在很大程度上是由于历史而不是设计。长期以来,GPU 硬件一直被设计为构建矢量线程,并以最佳处理三角形的方式将它们分配给执行单元。 OpenCL 不会将硬件泛化为对其他事物有用,但不会泛化到使实现效率低下的程度。
关于parallel-processing - OpenCL:工作组概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804153/
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 实现。它与操作系统
我是一名优秀的程序员,十分优秀!