OpenCL 不允许在常量 space 中延迟初始化变量

OpenCL doesn't allowes late initializtion of variable in constant space

我想生成一个矩阵,生成后将被许多线程读取,所以我用程序范围声明了它。它必须是常数,所以我只分配一次值所以

1) 为什么 openCl 只在声明时要求初始化?

2) 我该如何解决这个问题?

1)因为你无法告诉gpu哪些元素是由哪些线程写入的。常量由预处理器使用标量引擎准备,而不是并行引擎。并行引擎需要 N x N 次同步才能实现,其中 N 是参与构建常量缓冲区的线程数。

2-a) 如果你想使用常量内存,在内核中准备一个简单的(__global,不是常量)缓冲区,在下一个内核中使用它作为常量缓冲区(引擎把它放在常量内存 space)。但是常数 space 很小,所以矩阵应该很小。这需要 2 个内核,意味着内核开销。

2-b)如果缓存性能够用,就用buffer。所以它可以在一个内核中(第一个线程组准备矩阵,剩下的线程组使用它计算,直到第一组使用原子函数发出信号才开始)

2-c) 如果本地内存大于常量内存,您可以使用本地内存并自己为每个计算单元构建该矩阵,因此它应该需要相同数量的周期(如果使用所有内核可能会更少) 并且可能比常量内存更快。这不需要线程组之间的通信,所以会很快。

2-d)如果矩阵很大并且您需要大部分带宽,请将其分配给所有内存 spaces。示例:将 1/4 的矩阵放入常量内存(5 倍带宽),将 1/4 的矩阵放入本地内存(10 倍带宽),将 1/4 的矩阵放入全局内存(2 倍缓存性能),将剩余数据放入指令 space(指令本身),因此多个线程将同时在 4 个不同的地方工作,使用所有带宽(常量 + 本地 + 缓存 + 指令缓存)。