官方 OpenCL 2.2 标准是否支持 WaveFront?

2024-04-25

众所周知,AMD-OpenCL 支持 WaveFront(2015 年 8 月):http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_Optimization_Guide2.pdf http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_Optimization_Guide2.pdf

例如,AMD Radeon HD 7770 GPU 支持超过 25,000 进行中的工作项目,并且可以切换到新的波前(包含最多 到 64 个工作项)在一个周期内。


但为什么在 OpenCL 标准 1.0/2.0/2.2 中没有提到 WaveFront?

没有一个PDF是没有字的波前: https://www.khronos.org/registry/OpenCL/specs/ https://www.khronos.org/registry/OpenCL/specs/

我还发现:

  • 2013: https://community.amd.com/thread/160658 https://community.amd.com/thread/160658

OpenCL 是一个开放标准。它仍然不支持这种 swizzling 概念。它甚至还不支持波前/扭曲。

  • 2013: https://stackoverflow.com/a/19874984/1558037 https://stackoverflow.com/a/19874984/1558037

这就是为什么这个概念不在 OpenCL 规范本身中的原因。

  • 2011: https://forums.khronos.org/showthread.php/7211-How-can-i-split-my-work-load-in-a-GPU-with-OpenCL https://forums.khronos.org/showthread.php/7211-How-can-i-split-my-work-load-in-a-GPU-with-OpenCL

标准 OpenCL 没有“波前”的概念

  • 2011: https://www.cvg.ethz.ch/teaching/2011spring/gpgpu/GPU-Optimization.pdf https://www.cvg.ethz.ch/teaching/2011spring/gpgpu/GPU-Optimization.pdf

确实OpenCL 2.2官方标准仍然不支持WaveFront?


结论:

OpenCL 标准中没有 WaveFront,但是在 OpenCL-2.0 中,有一些具有类似于 WaveFronts 的 SIMD 执行模型的子组.

  • 第 100 页: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf

6.4.2 工作组/小组级职能

OpenCL 2.0 引入了 Khronos子组扩展。子组是 硬件 SIMD 执行模型的逻辑抽象类似于 波前、扭曲或矢量,并允许编程更接近 以独立于供应商的方式硬件。该扩展包括一组 与集合匹配的跨子组内置函数 上面指定的跨工作组内置函数。


他们一定采用了一种更加动态的方法,称为sub-group: https://www.khronos.org/registry/OpenCL/specs/opencl-2.2.pdf https://www.khronos.org/registry/OpenCL/specs/opencl-2.2.pdf

Sub-group: Sub-groups are an implementation-dependent grouping of work-items within a
work-group. The size and number of sub-groups is implementation-defined.

and

Work-groups are further divided into sub-groups,
which provide an additional level of control over execution.

and

The mapping of work-items to
sub-groups is implementation-defined and may be queried at runtime. 

所以即使它不被称为波前,它现在可以在运行时查询并且

在没有同步功能(例如屏障)的情况下, 子组内的工作项可以被序列化。在......的存在下 子组功能、子组内的工作项可以序列化 在任何给定的子组函数之前,在动态遇到的之间 子组职能对以及工作组职能和 内核的末尾。

即使步调一致的方式有时也可能会丢失。

除此之外,

 sub_group_all() and
sub_group_broadcast() and are described in OpenCL C++ kernel language and IL specifications.
The use of these sub-group functions implies sequenced-before relationships between statements
within the execution of a single work-item in order to satisfy data dependencies.

表示存在某种子组内通信。因为现在 opencl 有子内核定义:

Device-side enqueue: A mechanism whereby a kernel-instance is enqueued by a kernel-instance
running on a device without direct involvement by the host program. This produces nested
parallelism; i.e. additional levels of concurrency are nested inside a running kernel-instance.
The kernel-instance executing on a device (the parent kernel) enqueues a kernel-instance (the
child kernel) to a device-side command queue. Child and parent kernels execute asynchronously
though a parent kernel does not complete until all of its child-kernels have completed. 

最终,像这样的东西

kernel void launcher()
{
    ndrange_t ndrange = ndrange_1D(1);
    enqueue_kernel(get_default_queue(), CLK_ENQUEUE_FLAGS_WAIT_KERNEL, ndrange,
    ^{
    size_t id = get_global_id(0);
    }
    );
}

您应该能够生成您自己的(升级的?)波前,具有您需要的任何大小,并且它们与父内核同时工作(并且可以通信子组内线程),但它们不被称为波前,因为它们不是由硬件硬编码的(恕我直言) 。


2.0 api 规范说:

Extreme care should be exercised when writing code that uses
subgroups if the goal is to write portable OpenCL applications.

这让人想起 AMD 的 16 宽 simd 和 nvidia 的 32 宽 simd 与一些虚构的 FPGA 的 95 宽计算核心。也许是伪波前?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

官方 OpenCL 2.2 标准是否支持 WaveFront? 的相关文章

  • 类和互斥体

    假设我有一个类代表一些名为 foo 的数据结构 class foo public foo attr01 0 void f attr01 5 private int attr01 class fooSingleThreadUserClass
  • C# 中的线程和 GUI 元素

    我正在尝试制作一个基本的 IRC 客户端 但我的问题是让文本显示在 RTF 框中而不出现滞后 我决定使用线程 并且我想更新线程中的 RTF 框 但我不能 因为它给了我关于 RTF 框元素不是静态的错误 有什么见解吗 如果你们想要的话我会粘贴
  • Android SurfaceView 使用线程绘制画布

    我正在尝试使用线程在画布上绘图来创建一个简单的游戏引擎 但我遇到了一些无法解释的奇怪问题 这个 游戏 的目的是每秒在画布上画一个圆圈 这是可行的 但不是我想要的工作方式 似乎应用程序正在两个画布之间切换 并向每个画布添加一个圆圈 这样您就可
  • Java:BufferedReader 在 close() 上永远挂起,并且 StreamDecoder 不尊重线程中断

    我有一个 Java 程序 它启动一个由 Process 类表示的单独子进程 然后附加查看 Process 的 stdout stderr 的侦听器 在某些情况下 进程将挂起并停止取得进展 此时 TimeLimiter 将抛出 Timeout
  • Python Tkinter,停止线程函数

    我目前正在为 3D 打印机开发 GUI 并且遇到如何停止线程函数的问题 我希望能够单击 GUI 中具有另一个功能的按钮 该按钮将阻止线程函数通过串行端口发送 G 代码字符串 目前 该函数已合并线程 以允许在打印期间触发其他函数 我非常感谢有
  • 原始类型是易失性的还是同步的?

    在 Java 中 如果变量的大小小于或等于 32 位 则赋值是原子的 但如果变量的大小大于 32 位 则赋值不是原子的 在双重或长分配的情况下 使用什么 易失性 同步 会更有效 Like volatile double x y 同步不适用于
  • ThreadPoolExecutor 和队列

    我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • SLURM 节点、任务、核心和 CPU

    有人能够澄清这些东西到底是什么吗 据我所知 节点是集群内的计算点 本质上是一台计算机 任务是可以在单个节点或多个节点上执行的进程 核心基本上是指您希望在单个节点上分配多少 CPU 来执行分配给该 CPU 的任务 它是否正确 我混淆了什么吗
  • 如何从 Android 调用 RESTful 方法?

    我尝试了两种不同的方法来从 Android 调用简单的 REST 方法 所述 REST 方法 适用于其他客户端 仅返回一个 int val 例如 17 以下两次尝试都是基于我在网上找到的代码 有一种是这样的 公共无效onFetchBtnCl
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 在文件复制/上传未完成时读取文件内容

    例如 每 5 秒 服务器检查文件是否已添加到特定目录 如果是 它会读取并处理它们 相关文件可能非常大 例如 100 Mo 因此将它们复制 上传到上述目录可能会很长 如果服务器尝试访问尚未完成复制 上传的文件怎么办 JAVA是如何管理这些并发
  • 使用 async/await 抛出和捕获异常的正确方法

    全部请拿下面的二维码 Task
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • ExecutorService 应该是静态的和全局的

    我想在我的应用程序中使用相同的线程池 为此 我可以使ExecutorService静态和全局 以便我可以调用ThreadUtil executorService to get ExecutorService当我需要它的时候 public c
  • 2 个数组/图像相乘的多线程性能 - 英特尔 IPP

    我正在使用英特尔 IPP 来进行 2 个图像 数组 的乘法 我使用的是 Intel Composer 2015 Update 6 附带的 Intel IPP 8 2 我创建了一个简单的函数来乘以太大的图像 整个项目已附后 见下文 我想看看使

随机推荐