是否可以从内核动态分配全局内存? 在CUDA中,它是可能的,但我想知道在英特尔GPU上的OpenCL中是否也可以这样做。
例如:
__kernel void foo()
{
,
,
,
call malloc or clCreateBuffer here
}
有可能吗?如果是,究竟是怎么回事?
答案 0 :(得分:7)
不,OpenCL目前不允许这样做。
您可以通过预先创建一个非常大的缓冲区来实现自己的堆,然后通过分配偏移量来“分配”缓冲区的区域(使用atomic_add
来避免同步问题)。但是,在大多数情况下,我怀疑重新考虑您的算法并提出一种不需要动态内存分配的方法会更好。
这是一个使用预分配缓冲区来模拟内核中动态堆分配的示例。下一个free元素的堆和索引作为参数传递给内核,需要传递给我们的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);
...
}