有多少线程(或工作项)可以同时运行?

2024-02-24

我是 GPGPU 编程新手,正在研究 OpenCL 的 NVIDIA 实现。

我的问题是如何计算 GPU 设备的限制(线程数)。
据我了解,有许多工作组(相当于 CUDA 中的块),其中包含许多工作项(~ cuda 线程)。

  • 如何获取我的卡上存在的工作组数量(并且可以同时运行)以及一个工作组上存在的工作项目数量?

  • CL_DEVICE_MAX_COMPUTE_UNITS 对应什么?
    khronos 规范谈到了核心(“OpenCL 设备上的并行计算核心的数量。”)与我的显卡规范中给出的 CUDA 核心有什么区别。根据 NVIDIA 网站,在我的例子中,openCL 为 14 个核心,而我的 GeForce 8800 GT 有 112 个核心。

  • CL_DEVICE_MAX_WORK_GROUP_SIZE(在我的例子中为 512)是否对应于分配给特定工作组的工作项总数或可以在工作组中同时运行的工作项数量?

任何建议将不胜感激。


OpenCL标准没有指定OpenCL提供的抽象执行模型如何映射到硬件。您可以将任意数量的 T 个线程(工作项)排入队列,并提供工作组大小 (WG),至少具有以下约束(有关详细信息,请参阅 OpenCL 规范 5.7.3 和 5.8):

  • WG必须除T
  • WG 最多必须为DEVICE_MAX_WORK_GROUP_SIZE
  • WG 最多必须为KERNEL_WORK_GROUP_SIZE由返回GetKernelWorkGroupInfo;如果内核消耗大量资源,它可能小于设备最大工作组大小。

该实现管理硬件上内核的执行。单个工作组的所有线程必须调度在单个“多处理器”上,但单个多处理器可以同时管理多个工作组。

工作组内的线程以 32 个(NVIDIA warp)或 64 个(AMD wavefront)为一组执行。每个微架构都以不同的方式做到这一点。您可以在 NVIDIA 和 AMD 论坛以及每个供应商提供的各种文档中找到更多详细信息。

回答你的问题:线程数量没有限制。在现实世界中,您的问题受到输入/输出大小(即设备内存大小)的限制。要处理 4GB 的浮点缓冲区,您可以将 1G 线程入队,例如 WG=256。该设备必须在其少量(例如 2 到 40 个)多处理器上安排 4M 个工作组。

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

有多少线程(或工作项)可以同时运行? 的相关文章

  • 使用 GPU PyOpenCL 优化 python 代码的不同方法:内核 GPU/PyOpenCL 内的 extern 函数

    我使用以下命令来分析我的 Python 代码 python2 7 m cProfile o X2 non flat multiprocessing dummy prof X2 non flat py 然后 我可以全局可视化不同贪婪函数的重新
  • 并行化 std::nth_element 和 std::partition

    我正在移植使用的 C 代码std nth element and std partition到 OpenCL nth element http www cplusplus com reference algorithm nth elemen
  • OpenCL 内核是异步执行的吗?

    对于 CUDA 我知道它们是在向默认流 空流 发出启动命令后异步执行的 那么在 OpenCL 中又如何呢 示例代码如下 cl context context cl device id device id cl int err cl kern
  • 我应该研究 PTX 来优化我的内核吗?如果是这样,怎么办?

    您是否建议阅读内核的 PTX 代码以进一步优化内核 一个例子 我读到 可以从 PTX 代码中找出自动循环展开是否有效 如果不是这种情况 则必须在内核代码中手动展开循环 PTX 代码还有其他用例吗 你查看过你的 PTX 代码吗 在哪里可以找到
  • CMake找不到NVIDIA的opencl sdk

    我刚刚安装了 NVIDIA CUDA 工具套件 用它在 Windows 8 1 上开发 OpenCL 应用程序 我遇到了一些问题 1 FinedOpenCl cmake 不起作用 因为 Nvidia 工具包未设置 opencl dir cm
  • 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
  • OpenCL 产生错误的计算

    我一直尝试使用openCL做一些计算 但结果不正确 我输入了三个 float3 如下所示 300000 0 0 300000 300000 0 300000 300000 300000 进入这个内核 kernel void gravitat
  • OpenCL 编译器预处理定义?

    我正在 Snow Leopard 上开发 OpenCL 代码 并且了解 OpenCL 即时编译是由 Clang LLVM 完成的 是否使用了 C 预处理器 有没有办法使用编译器设置预处理定义 存在哪些定义 我希望代码知道它是为 CPU 还是
  • GPGPU:普通 PC 陷入困境的后果

    我在一本书中读到 在波前或扭曲中 所有线程共享一个公共程序计数器 那么它的后果是什么呢 为什么这很重要 NVIDIA GPU 一次执行 32 个线程 扭曲 AMD GPU 一次执行 64 个线程 波前 控制逻辑 读取和数据路径的共享减少了面
  • 合理化我的简单 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
  • 有适用于 mac os X 10.8 的 opencl 分析器吗?

    我试图找到 OpenCL 内核中的瓶颈 是否可以在 mac os X 上分析 OpenCL 程序 我发现 gDebuggerhttp www gremedy com http www gremedy com 但需要 10 5 或 10 6
  • 如何在 Docker 容器内运行 OpenCL + OpenGL?

    目的是在 Docker 容器内运行 OpenCL OpenGL 互操作 应用程序 但我还没有成功 Intro 我有配备 NVidia 显卡的笔记本电脑 因此我认为利用 NVidia Dockerfiles 1 2 将是一个很好的起点 以下
  • OpenCL 在调用 clGetPlatformIDs 时崩溃

    我是 OpenCL 新手 在配备 Intel R HD Graphics 4000 运行 Windows 7 的 Core i5 计算机上工作 我安装了支持 OpenCL 的最新 Intel 驱动程序 GpuCapsViewer 确认我有
  • 空的 openCL 程序抛出弃用警告

    我下载了 AMD APP 3 0 SDK 一旦包含 include
  • 如何在 C 中将向量参数传递给 OpenCL 内核?

    我在将向量类型 uint8 参数从 C 中的主机代码传递到 OpenCL 内核函数时遇到问题 在主机中 我将数据存储在数组中 cl uint dataArr 8 1 2 3 4 5 6 7 8 我的真实数据不仅仅是 1 8 这只是为了便于解
  • Linux 上的 OpenCL 编译

    我是 OpenCL 的新手 从昨天开始 我尝试使用 OpenCL 进行并行编程 而不是使用我更熟悉且以前体验过的 CUDA 现在我有 NVIDIA GTX 580 GPU Ubuntu Linux 12 04 操作系统和 CUDA SDK
  • OpenCL 与 OpenMP 性能对比 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有研究比较 OpenCL 与 OpenMP 的性能 具体来说 我对使用 OpenCL 启动线程的开销成本感兴趣 例如 如果将域分解
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

    我的第一个问题是如何获取 Nvidia GPU 上 OpenCL 内核代码的寄存器使用信息 因为 nvcc 编译器给出了相同的使用信息nvcc ptxas options vCUDA 内核代码的标志 我还从 AMD GPU for Open
  • 在 open CL 中将结构数组传递给内核

    你好 我正在尝试在 open CL 中实现距离向量程序 基本上我在将结构数组作为参数传递到内核时遇到问题 我的结构定义是这样的 typedef struct int a nodes 4 node node srcA 为此分配内存后 我使用此

随机推荐