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