【发布时间】:2014-09-11 06:46:02
【问题描述】:
是否可以从内核动态分配全局内存? 在 CUDA 中是可能的,但我想知道这在英特尔 GPU 上的 OpenCL 中是否也是可能的。
例如:
__kernel void foo()
{
,
,
,
call malloc or clCreateBuffer here
}
有可能吗?如果是,具体是多少?
【问题讨论】:
标签: opencl
是否可以从内核动态分配全局内存? 在 CUDA 中是可能的,但我想知道这在英特尔 GPU 上的 OpenCL 中是否也是可能的。
例如:
__kernel void foo()
{
,
,
,
call malloc or clCreateBuffer here
}
有可能吗?如果是,具体是多少?
【问题讨论】:
标签: opencl
不,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);
...
}
【讨论】:
malloc 函数在设备上分配较小的缓冲区块。