我目前正在开发嵌入Vivante GC2100 GPU的i.MX6.Q平台。在Vivante提供的(非常短的)技术规范中,它表示如果我进行矢量化,我有4个着色器核心,如果我没有(http://www.vivantecorp.com/index.php/en/technology/gpgpu.html)则有16个。
当我直接恢复关于我的GPU的OpenCL信息时,它说我有4个计算单位,首选矢量宽度为4.
这是否意味着GPU会自动检测我是否进行了矢量化? 它是否总是正确地使用他可以使用的所有核心(在我的程序的当前版本中我没有开发矢量化)并且有没有办法确定它?
如果我不使用对齐数据,我是否还需要进行向量化以使gpu功能受益,或者我可以继续使用我的gpu而不进行向量化?我目前正在为OpenCL推出i.MX6.Q,所以无论如何我都会对自己进行矢量化并亲自看看,但如果你们知道一些关于它的理论,我就把它拿走!!
巴普蒂斯特
答案 0 :(得分:2)
这取决于您的内核是否可以通过您正在使用的特定OpenCL编译器进行矢量化。如果您将数据解压缩(所有单个浮点数),那么您的编译器可能能够执行work-item vectorization。
事实上,由于这个原因,与OpenCL不同,CUDA不实现矢量类型或操作。我建议不要手动打包,因为它会使编译器自动向量化变得更复杂。
GPU不会检测或“使用”矢量化 - 编译器会生成正确的目标代码,尽可能使用矢量化指令(基于您的逻辑)。至于找出你的特定内核是否是矢量化的,你必须参考你的实现的文档/工具。至于使用所有核心,这取决于全球的工作量。如果你没有为GPU上的所有SM提交足够的工作,那么它就会被充分利用。
另外,请注意,大多数OpenCL实现都会更喜欢(并分配)对齐的数据,除非您专门阻止它using打包属性。