代码之家  ›  专栏  ›  技术社区  ›  lhahne

可以跨越OpenCL内核在CPU和GPU上并发运行

  •  4
  • lhahne  · 技术社区  · 15 年前

    假设我有一台计算机,它有一个多核处理器和一个GPU。我想写一个运行在平台所有核心上的OpenCL程序。这是可能的,还是需要选择运行内核的单个设备?

    4 回复  |  直到 7 年前
        1
  •  2
  •   Dr. Snoopy    15 年前

    理论上是的,你可以,cl api允许它。但是平台/实现必须支持它,我认为大多数cl实现都不支持它。

    为此,请获取CPU设备和GPU设备的cl_device_id,并使用clcreateContext创建这两个设备的上下文。

        2
  •  2
  •   elmattic    15 年前

    不,你不能同时在CPU和GPU上自动扩展内核,它可以是一个也可以是另一个。

    您可以这样做,但这将涉及手动创建和管理两个命令队列(每个设备一个)。

    查看此线程: http://devforums.amd.com/devforum/messageview.cfm?catid=390&threadid=124591&messid=1072238&parentid=0&FTVAR_FORUMVIEWTMP=Single

        3
  •  2
  •   doug65536    12 年前

    一个上下文只能用于一个平台。如果您的多设备代码需要跨平台工作(例如,Intel平台CPU OpenCL和Nvidia GPU),则需要单独的上下文。

    但是,如果GPU和CPU恰好在同一个平台上,那么可以使用一个上下文。

    如果您在同一平台上使用多个设备(两个相同的GPU或来自同一制造商的两个GPU),那么您可以共享上下文,只要它们都来自一个clgetdeviceids调用。

    编辑: 我应该补充一点,GPU+CPU上下文并不意味着任何自动管理的CPU+GPU执行。通常,让驱动程序分配一个内存缓冲区是一个最佳实践,该缓冲区可以由GPU进行DMA以获得最大性能。在CPU和GPU处于同一环境中的情况下,可以跨两个设备共享这些缓冲区。

    你仍然需要自己分担工作量。我最喜欢的负载平衡技术是使用事件。每隔n个工作项,将一个事件对象附加到一个命令(或将一个标记排队),然后等待您在n个工作项之前设置的事件(前一个)。如果您不需要等待,那么您需要在该设备上增加n,如果您必须等待,那么您应该减少n。这将限制队列深度,n将在理想深度周围徘徊以使设备保持忙碌。无论如何,您都需要这样做,以避免导致GUI导致饥饿。只需在每个命令队列中保留n个命令(CPU和GPU有单独的n个命令),它就可以完美地划分。

        4
  •  1
  •   DarkZeros    14 年前

    不能将内核扩展到多个设备。但是,如果您重新运行的代码不依赖于其他结果(即:处理16KB的数据块,这需要大量处理),则可以在GPU和CPU上启动相同的内核。在GPU和CPU上放置一些块。

    这样可以提高性能。

    您可以这样做,创建一个为CPU和GPU共享的CLContext,以及2个命令队列。

    这不适用于所有的谷粒。有时,内核代码应用于所有输入数据,并且不能分为部分或块。

    推荐文章