我目前正在开发一个i.MX6.Q平台,其中嵌入了Vivante GC2100图形处理器。在Vivante提供的(非常简短的)技术规范上,它说如果我矢量化,我会得到4个着色器核心,如果我不向量化,我会得到16个着色器核心(http://www.vivantecorp.com/index.php/en/technology/gpgpu.html)。
当我直接恢复关于我的图形处理器的OpenCL信息时,它说我有4个计算单元,首选的向量宽度是4。
这是否意味着GPU会自动检测我是否进行了矢量化?它会一直正确地使用他能使用的所有核心吗(在我的程序的当前版本中,我没有开发矢量化),有没有办法确定这一点?
如果我不使用对齐的数据,我是否仍然需要矢量化才能使gpu功能受益,或者我是否可以继续使用我的gpu而不使用矢量化?我目前正在把i.MX6.Q放在OpenCL上,所以我会把我能看到的东西矢量化,然后自己去看,但是如果你们知道一些关于它的理论,我就接受它!
巴蒂斯特
发布于 2013-10-28 23:03:24
这取决于您使用的特定OpenCL编译器是否可以向量化您的内核。如果你保持你的数据未打包(全部是单浮点),那么你的编译器就有可能执行work-item vectorization。
事实上,由于这个原因,CUDA不像OpenCL那样实现向量类型或操作。我建议不要手动打包,因为这会使编译器自动向量化的事情变得更加复杂。
GPU不检测或“使用”矢量化-编译器生成正确的目标代码,在可能的情况下使用矢量化指令(基于您的逻辑)。至于找出你的特定内核是否被矢量化,你必须参考你的实现的文档/工具。至于使用所有内核,这取决于全局工作大小。如果你没有提交足够的工作,使得GPU上的所有SMs都很忙,那么它就会被充分利用。
另外,请注意,大多数OpenCL实现都会首选(并分配)对齐的数据,除非您专门阻止它使用using属性。
https://stackoverflow.com/questions/19637606
复制相似问题