我试图在内核中声明一个__global内存块,比如
__global float arr[200];
我认为这会在全局内存中创建一个我可以在内核中引用的数组。该程序编译成功,但随后 当我跑它时,它表明:
错误:具有自动存储持续时间的变量 不能存储在指定的地址空间
我不知道为什么会这样。 为了使用全局内存,我们是否必须在使用之前在主机端创建缓冲区?
如果我想创建一个由所有线程共享的数组,除了为这个全局数组传递另一个新参数,我该怎么做呢?
答案 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调用进行分配,并且对工作组中的所有线程都可见。