为什么会有 CL_DEVICE_MAX_WORK_GROUP_SIZE?

2024-04-05

我试图了解 OpenCL 设备(例如 GPU)的体系结构,但我不明白为什么本地工作组中的工作项数量有明确的限制,即常量 CL_DEVICE_MAX_WORK_GROUP_SIZE。

在我看来,这应该由编译器处理,即,如果(为简单起见,一维)内核以本地工作组大小 500 执行,而其物理最大值为 100,并且内核看起来如下所示:

__kernel void test(float* input) {
    i = get_global_id(0);
    someCode(i);
    barrier();
    moreCode(i);
    barrier();
    finalCode(i);
}

那么它可以自动转换为该内核上工作组大小为 100 的执行:

__kernel void test(float* input) {
    i = get_global_id(0);
    someCode(5*i);
    someCode(5*i+1);
    someCode(5*i+2);
    someCode(5*i+3);
    someCode(5*i+4);
    barrier();
    moreCode(5*i);
    moreCode(5*i+1);
    moreCode(5*i+2);
    moreCode(5*i+3);
    moreCode(5*i+4);
    barrier();
    finalCode(5*i);
    finalCode(5*i+1);
    finalCode(5*i+2);
    finalCode(5*i+3);
    finalCode(5*i+4);
}

然而,这似乎不是默认情况下完成的。为什么不?有没有办法使这个过程自动化(除了我自己编写预编译器之外)?或者是否存在一个内在的问题,可能使我的方法在某些示例上失败(您能给我一个)吗?


我认为 CL_DEVICE_MAX_WORK_GROUP_SIZE 的起源在于底层硬件实现。

多个线程同时在计算单元上运行,每个线程都需要保持状态(用于调用、跳转等)。大多数实现为此使用堆栈,如果您查看 AMD Evergreen 系列,它们是可用堆栈条目数量的硬件限制(每个堆栈条目都有子条目)。这本质上限制了每个计算单元可以同时处理的线程数量。

至于编译器可以做到这一点,使其成为可能。它可以工作,但要明白这意味着再次重新编译内核。这并不总是可能的。我可以想象这样的情况:开发人员以二进制格式转储每个平台的编译内核,并将其与他们的软件一起发布,只是出于“不那么开源”的原因。

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

为什么会有 CL_DEVICE_MAX_WORK_GROUP_SIZE? 的相关文章

  • BLAS 相当于 GPU 的 LAPACK 函数

    在LAPACK中有这个function http www netlib org lapack double dspgvx f对角化 SUBROUTINE DSPGVX ITYPE JOBZ RANGE UPLO N AP BP VL VU
  • 在 OpenCL 内核中实现小型查找表的最佳方法是什么

    在我的内核中 需要对一个小查找表 只有 8 个 32 位整数 进行大量随机访问 每个内核都有一个唯一的查找表 下面是内核的简化版本 用于说明如何使用查找表 kernel void some kernel global uint global
  • 在多 GPU 系统中,如何将 OpenCL 设备与给定 PCI 供应商、设备和总线 ID 的特定 GPU 相匹配?

    我希望能够在由 PCI ID 标识的多 GPU 系统上将 OpenCL 设备与系统中的 GPU 进行匹配 例如 如果我的系统具有多个 GPU 可能来自不同的供应商 我可以通过枚举 PCI 总线来列出设备 这为我提供了 PCI 供应商 设备和
  • OpenCL 中的最佳本地/全局工作规模

    我想知道如何在 OpenCL 中为不同设备选择最佳的本地和全局工作大小 AMD NVIDIA INTEL GPU 有什么通用规则吗 我是否应该分析设备的物理构建 多处理器数量 多处理器中的流处理器数量等 这取决于算法 实现吗 因为我看到一些
  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • 在 OpenCL 中,mem_fence() 与 Barrier() 相比有何作用?

    Unlike barrier 我想我明白 mem fence 不影响工作组中的所有项目 OpenCL 规范指出 第 6 11 10 节 对于mem fence 命令加载和存储执行内核的工作项 所以它适用于single工作项 但同时 在第 3
  • OpenGL/OpenCL 互操作、OpenCL 渲染到纹理的麻烦

    我正在尝试将 OpenCL 渲染为 OpenGL 256x256 纹理 全部编译正确 但仅呈现黑屏 如果关闭纹理 它通常会渲染白色矩形 Setting up OpenCL const char source kernel void Main
  • 工作组之间的 OpenCL 同步

    是否可以同步 OpenCL 工作组 例如 我有 100 个工作组 每个工作组只有一个项目 不要问我为什么 这是一个例子 我需要对每个工作项设置障碍 以确保所有工作组都会在这 100 个工作组中的每个工作项达到此障碍点后继续 不 你不能 您可
  • opencl中的时钟()

    我知道CUDA中有一个函数clock 你可以在其中放入内核代码并查询GPU时间 但我想知道OpenCL中是否存在这样的东西 有没有办法查询OpenCL中的GPU时间 我正在使用 NVIDIA 的工具包 OpenCL 没有直接查询时钟周期的方
  • OpenCL:头文件的附加目录

    OpenCL 规范中写道5 6 3 构建选项 5 6 3 1 预处理器选项 I dir Add the directory dir to the list of directories to be searched for header f
  • 为什么 AMD GCN 使用非零 NULL?

    这次提交 https reviews llvm org rL289252 says In amdgcn https en wikipedia org wiki Graphics Core Next目标 全局 常量和通用地址空间中的空指针取值
  • 合理化我的简单 OpenCL 内核中有关全局内存的情况

    const char programSource kernel void vecAdd global int a global int b global int c int gid get global id 0 for int i 0 i
  • 在 Windows 8 (x64) 中安装期间出现 PyOpenCL“致命错误:CL/cl.h:没有此类文件或目录”错误

    在大量搜索此问题的解决方案后 我发现此特定错误尚未针对 Windows 正确记录 所以我决定将这个问题与解决方案一起发布 抱歉 如果我将其发布在错误的部分 我希望这个解决方案能够帮助用户解决未来 PyOpenCL 安装错误 请注意 此处使用
  • GPU 上非原子写入的保证很弱吗?

    OpenCL 和 CUDA 包含原子操作已有好几年了 尽管显然并非每个 CUDA 或 OpenCL 设备都支持这些操作 但是 我的问题是关于由于非原子写入而 共存 种族的可能性 假设网格中的多个线程都写入全局内存中的同一位置 我们是否可以保
  • 为什么程序(全局)作用域变量必须是 __constant?

    我是 OpenCL 新手 对这个限制感到非常困惑 例如 如果我想写一个LCG 我必须使状态字可以修改为rand and srand 在 ANSI C 中 我将使用以下方法来做到这一点 ANSI C static unsigned long
  • 为什么会有 CL_DEVICE_MAX_WORK_GROUP_SIZE?

    我试图了解 OpenCL 设备 例如 GPU 的体系结构 但我不明白为什么本地工作组中的工作项数量有明确的限制 即常量 CL DEVICE MAX WORK GROUP SIZE 在我看来 这应该由编译器处理 即 如果 为简单起见 一维 内
  • 使用 OpenCL 或其他 GPGPU 框架在现代 x86 硬件上的 CPU 和 GPU 之间共享数据

    AMD Kaveri 的 hUMA 异构统一内存访问 和 Intel 第四代 CPU 证明了 CPU 和 GPU 硬件的不断统一 应该允许 CPU 和 GPU 之间进行无副本的数据共享 我想知道 最新的 OpenCL 或其他 GPGPU 框
  • 杀死 OpenCL 内核

    有没有办法通过 OpenCL API 终止正在运行的 OpenCL 内核 我在规范中没有找到任何内容 我能想到的唯一解决方案是 1 定期检查内核中主机希望内核停止时写入的标志 或 2 在单独的进程中运行内核并终止整个进程 我认为这两个都不是
  • 在内核 OpenCL 中实现 FIFO 的最佳方法

    目标 在 OpenCL 中实现下图所示 OpenCl 内核所需的主要内容是将系数数组和临时数组相乘 然后最后将所有这些值累加为 1 这可能是最耗时的操作 并行性在这里非常有帮助 我正在为内核使用一个辅助函数来执行乘法和加法 我希望这个函数也
  • 如何在 pyopencl 中创建可变大小的 __local 内存?

    在我的 C OpenCL 代码中我使用clSetKernelArg创建 可变尺寸 local我的内核中使用的内存 OpenCL 本身不提供该内存 看我的例子 clSetKernelArg clKernel ArgCounter sizeof

随机推荐