gpt4 book ai didi

opencl - OpenCL 上下文是什么意思?他们为什么有意义?

转载 作者:行者123 更新时间:2023-12-02 01:23:30 24 4
gpt4 key购买 nike

OpenCL API 涉及创建“执行上下文”,许多 API 调用都需要上下文和设备 ID。

但是这些有什么用呢?我们使用一系列设备创建上下文。这不是一个非常人为的构造吗?我的意思是,如果我们让所有设备共享一些公共(public)内存空间作为预定义上下文,那么我想这是有道理的。但除此之外 - 为什么不让特定于设备的 OpenCL API 完全忽略上下文,而让多设备相关的 API 在平台级别发生?

现在,如果您告诉我“哦,但是上下文有 X 或做 Y 而设备和平台没有”- 请解释为什么 X 或 Y 不应该在设备上下文或平台上下文中。 clCreateContext reference page (OpenCL 1.2) 列表:

  • 命令队列:特定于设备。
  • 内存:可能是多设备的,但由于上下文中设备的选择是任意的,它似乎不是正确的抽象。
  • 程序和内核对象:为什么这不是特定于设备的? (或者可能 - 特定于设备和用户?)
  • 用于“在上下文中指定的一个或多个设备上执行内核”:不清楚特定于设备(或者平台范围,如果我们更关心同步)有什么问题。

PS - CUDA 也有“上下文”,但它们是特定于线程和特定于设备的,并且封装了诸如“同步时该线程是否应该阻塞?”之类的策略。或者“这个线程应该在安排 GPU 工作后让步”等)

最佳答案

为什么上下文需要设备作为参数?因为某些平台有多个设备(即:AMD 有一个 CPU 设备和一个 GPU 设备)。如果您删除该功能,那么唯一的选择是:

  • 缓冲区仅针对每个设备:这意味着不可能在 CL 程序中使用多个设备。或者是,但您需要在它们之间进行显式复制。

    • 一开始看起来还不错。但是尝试在 8 GPU 系统中进行显式复制。如果您不先从特定 GPU 删除缓冲区,调用也可能会返回 OutOfMemory 并使您的应用程序崩溃。要么您的应用程序完美平衡,要么特定 GPU 出现瓶颈并使其内存饱和的可能性非常高。让 API 为您处理所有副本要容易得多。
  • 缓冲区是每个平台:这意味着,在单个 GPU 应用程序中,您需要指定应将缓冲区复制到何处。解决方案可能还是显式复制。和以前一样的问题。

此外,上下文提供与 GL 上下文相同的抽象,隔离您正在使用的所有“软”资源,并在销毁时清理并销毁其中的所有内容。

如果创建上下文对象的应用程序被终止或出现 SEG_FAULTS,则很容易取消分配资源或该应用程序,而不会影响任何其他并行运行的应用程序。


还有:

program and kernel objects: why is this not device-specific? (or maybe - device and user specific?)

内核已经是特定于设备的,因为它们是程序和给定设备中函数的特定实例。

您可以使用同一程序制作任意数量的内核,但参数不同。这非常有用且有意义,与其拥有一个内核对象并在每次调用中更改其参数,不如使用多个内核实例更有意义。

关于opencl - OpenCL 上下文是什么意思?他们为什么有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38587810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com