opencl内核中的动态全局内存分配

opencl内核中的动态全局内存分配,opencl,Opencl,是否可以从内核动态分配全局内存? 在CUDA中,这是可能的,但我想知道,在英特尔GPU上的OpenCL中,这是否也是可能的 例如: __kernel void foo() { , , , call malloc or clCreateBuffer here } 可能吗?如果是,具体是什么?否,这在OpenCL中是不允许的 您可以通过预先创建一个非常大的缓冲区来实现自己的堆,然后通过使用atomic_add分配偏移量来“分配”缓冲区区域,以避免同步问题。然而,在大多数情况下,我认为最

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

例如:

__kernel void foo()

{

,
,
,

call malloc or clCreateBuffer here


} 

可能吗?如果是,具体是什么?

否,这在OpenCL中是不允许的

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

下面是一个使用预分配缓冲区模拟内核内动态堆分配的示例。下一个空闲元素的堆和索引作为参数传递到内核中,并且需要传递到我们的malloc函数中。在OpenCL2.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);
  ...
}

不,这在OpenCL中是不允许的

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

下面是一个使用预分配缓冲区模拟内核内动态堆分配的示例。下一个空闲元素的堆和索引作为参数传递到内核中,并且需要传递到我们的malloc函数中。在OpenCL2.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);
  ...
}

你能详细说明一下这个原子添加用法吗?@user3891236我添加了一个简单的示例,演示如何模拟堆。这是在主机或设备中分配的?你可以在主机上一次性分配堆,然后使用此malloc函数在设备上分配较小的缓冲区块。某些地址偏移可能不满足某些结构的对齐限制,因此可能只需要相同大小的结构/变量,除非“size”中添加了变量填充。请详细说明此原子添加用法好吗?@user3891236我添加了一个简单示例,演示如何模拟堆。这是在主机或设备中分配的?您可以在主机上一次性分配堆,然后使用此malloc函数在设备上分发较小的缓冲区块。某些地址偏移可能不满足某些结构的对齐限制,因此可能只需要相同大小的结构/变量,除非在“size”中添加了变量填充。