1

我目前正在开发嵌入 Vivante GC2100 GPU 的 i.MX6.Q 平台。在 Vivante 提供的(非常短的)技术规范中,它说如果我矢量化,我有 4 个着色器核心,如果我不矢量化,我有 16 个(http://www.vivantecorp.com/index.php/en/technology/gpgpu.html)。

当我直接恢复关于我的 GPU 的 OpenCL 信息时,它说我有 4 个计算单元,首选向量宽度是 4。

这是否意味着 GPU 会自动检测我是否矢量化?它会始终正确使用他可以使用的所有内核(在我的程序的当前版本中,我没有开发矢量化)并且有办法确定吗?

如果我不使用对齐的数据,我是否仍然需要矢量化以使 gpu 功能受益,或者我可以继续使用我的 gpu 而不进行矢量化?我目前正在为 OpenCL 准备 i.MX6.Q,所以无论如何我都会将我能做的矢量化并自己查看,但如果你们知道一些关于它的理论,我接受它!

巴蒂斯特

4

1 回答 1

2

这取决于您的内核是否可以被您使用的特定 OpenCL 编译器矢量化。如果您保持数据未打包(所有单个浮点数),那么您的编译器可能能够执行工作项矢量化

事实上,由于这个原因,CUDA 不像 OpenCL 那样实现向量类型或操作。我建议不要手动打包,因为它使编译器自动矢量化变得更加复杂。

GPU 不检测或​​“使用”矢量化 - 编译器生成正确的目标代码,尽可能使用矢量化指令(基于您的逻辑)。至于确定您的特定内核是否已矢量化,您必须参考实现的文档/工具。至于使用所有内核,这取决于全局工作量。如果你没有提交足够的工作让 GPU 上的所有 SM 都忙起来,那么它就会未被充分利用。

另外,请注意,大多数 OpenCL 实现会更喜欢(并分配)对齐的数据,除非您使用packed 属性特别阻止它。

于 2013-10-28T15:03:24.217 回答