在内核中声明__global对象

时间:2015-07-01 20:22:18

标签: memory opencl

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

__global float arr[200];

我认为这会在全局内存中创建一个我可以在内核中引用的数组。该程序编译成功,但随后 当我跑它时,它表明:

  

错误:具有自动存储持续时间的变量             不能存储在指定的地址空间

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

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

2 个答案:

答案 0 :(得分:1)

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

```{r results='asis'}
  library('xtable')
  df <- data.frame(A = c(1.00123, 33.1, 6),B = c(111111, 3333333, 3123.233))

  print(xtable(df, display = c("s","f","f"), digits = 4),
  format.args = list(big.mark = " ", decimal.mark = ","),type="html")
```

虽然当然要小心初始化,但是没有办法在调度中同步工作项,因此如果你有多个工作组,那么初始化它并在同一个内核中使用它是不切实际的。

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

为什么传递一个新的论证这样的问题?

答案 1 :(得分:0)

__global内存对象只能通过主机端的API调用进行分配。 您还可以使用__local内存对象,该对象可以通过主机端以及内核内的API调用进行分配,并且对工作组中的所有线程都可见。