在内核中声明 __global 对象

Declare __global object inside kernel

我试图在内核中声明一个__global内存块,比如

__global float arr[200];

我假设这会在我可以在内核中引用的全局内存中创建一个数组。程序编译成功,但是随后 当我运行它时,它表示:

error: variable with automatic storage duration cannot be stored in the named address space

我不知道为什么会这样。 为了使用全局内存,我们是否必须在使用它之前在主机端创建一个缓冲区?

如果我想创建一个由所有线程共享的数组,除了为这个全局数组传递另一个新参数之外,我可以做些什么呢?

__global 内存对象只能通过主机端的 API 调用来分配。 您还可以使用 __local 内存对象,它可以通过 API 在主机端和内核内部调用分配,并且对工作组中的所有线程可见。

您可以在程序范围内分配它,至少在 OpenCL 2 中是这样。

__global float arr[200];
kernel void foo()
{
   if(get_global_id(0) == 0)
     arr[0] = 3;
}

尽管当然要小心初始化,但无法在分派中同步工作项,因此如果您有多个工作组,则初始化它并在同一个内核中使用它并不实际。

在内核范围内分配它并没有多大意义。如果工作组是序列化的,那么内核代码中分配的全局数组的生命周期是多少?它是否应该比一个工作组、一个调度更持久,并永久保持在该内核和下一个内核之间共享?显而易见的可能是它与内核具有相同的生命周期,但是如果没有竞争就不可能初始化和使用。如果它在多个内核中持久存在,那么主机分配或程序范围分配更有意义。

为什么传递一个新参数是个问题?