【问题标题】:Dynamic global memory allocation in opencl kernelopencl 内核中的动态全局内存分配
【发布时间】:2014-09-11 06:46:02
【问题描述】:

是否可以从内核动态分配全局内存? 在 CUDA 中是可能的,但我想知道这在英特尔 GPU 上的 OpenCL 中是否也是可能的。

例如:

__kernel void foo()

{

,
,
,

call malloc or clCreateBuffer here


} 

有可能吗?如果是,具体是多少?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    不,OpenCL 目前不允许这样做。

    您可以通过预先创建一个非常大的缓冲区来实现自己的堆,然后通过分配偏移量来“分配”缓冲区的区域(使用atomic_add 以避免同步问题)。但是,在大多数情况下,我怀疑最好重新考虑您的算法并提出一种不需要动态内存分配的方法。


    这是一个使用预分配缓冲区来模拟内核内部的动态堆分配的示例。下一个空闲元素的堆和索引作为参数传递给内核,并且需要传递给我们的malloc 函数。在 OpenCL 2.0 中,我们可以使用程序范围全局变量来避免这样做。

    global void* malloc(size_t size, global uchar *heap, global uint *next)
    {
      uint index = atomic_add(next, size);
      return heap+index;
    }
    
    kernel void foo(global uchar *heap, global uint *next)
    {
      // Allocate some memory from heap
      global void *data = malloc(4, heap, next);
      ...
    }
    

    【讨论】:

    • 您能否详细说明一下 atomic_add 的用法?
    • @user3891236 我添加了一个简单的示例来展示如何模拟堆。
    • 这是分配在主机还是设备?
    • 您在主机上一次性分配所有堆,然后使用 malloc 函数在设备上分配较小的缓冲区块。
    • 某些地址偏移量可能不满足某些结构的对齐限制,因此它可能只需要相同大小的结构/变量,除非在“大小”中添加了变量填充。
    猜你喜欢
    • 2013-11-09
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2016-07-15
    • 2014-06-10
    相关资源
    最近更新 更多