2017-01-09 66 views

回答

0

1)因为你不能告诉gpu哪些线程写了哪些元素。常量是由预处理器使用标量引擎准备的,而不是平行的。并行引擎需要N×N次同步才能实现,其中N是参与构建常量缓冲区的线程数。如果你想使用常量内存,在内核中准备一个简单的(__全局,而不是常量)缓冲区,在下一个内核中使用它作为常量缓冲区(引擎将其放入常量内存空间中)。但恒定的空间很小,所以矩阵应该很小。这需要2个内核,意味着内核开销。

2-b)如果缓存性能足够,只需使用缓冲区即可。所以它可以在单个内核中(第一个线程组准备矩阵,剩余的使用它计算,直到第一个组使用原子函数给出信号时才开始)

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

2-d)如果矩阵是大,你最需要的带宽,分发到所有的存储空间。例如:将矩阵的1/4放到常量内存(5倍带宽),将矩阵的1/4放到本地内存(10倍带宽),将全矩阵的1/4放到全局内存(缓存性能的2倍),将剩余的数据放到指令空间(指令本身),因此多个线程将同时在4个不同的地方工作,使用所有带宽(常量+本地+缓存+指令缓存)。