OpenCL计算单元信息

OpenCL计算单元信息,opencl,gpgpu,Opencl,Gpgpu,我目前正在一个嵌入Vivante GC2100 GPU的I.MX6.Q平台上工作。在Vivante提供的(非常简短的)技术规范中,它说如果我矢量化,我得到了4个着色器核心,如果我不矢量化,我得到了16个() 当我直接恢复关于我的GPU的OpenCL信息时,它说我得到了4个计算单元,首选的向量宽度是4 这是否意味着GPU将自动检测我是否矢量化? 它是否总是正确地使用他能使用的所有核心(在我的程序的当前版本中,我没有开发矢量化),有没有办法确保它 如果我不使用对齐的数据,我是否仍然需要矢量化以受益于

我目前正在一个嵌入Vivante GC2100 GPU的I.MX6.Q平台上工作。在Vivante提供的(非常简短的)技术规范中,它说如果我矢量化,我得到了4个着色器核心,如果我不矢量化,我得到了16个()

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

这是否意味着GPU将自动检测我是否矢量化? 它是否总是正确地使用他能使用的所有核心(在我的程序的当前版本中,我没有开发矢量化),有没有办法确保它

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


Baptiste

这取决于您使用的特定OpenCL编译器是否可以对内核进行矢量化。如果您将数据解压(所有单个浮点),那么您的编译器可能能够执行

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

GPU不检测或“使用”矢量化-编译器生成正确的目标代码,尽可能使用矢量化指令(基于您的逻辑)。至于确定您的特定内核是否进行了矢量化,您必须参考实现的文档/工具。至于使用所有内核,这取决于全局工作大小。如果你没有提交足够的工作,使GPU上的所有短信都很忙,那么它将没有得到充分利用


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

Ok。我懂了。问题是我的程序由几个操作组成,这些操作可以看作是两个FIR模式(检测像素周围区域的最小值/最大值并保存)、一个IIR模式(线程需要事先计算才能开始执行)和一个经典的gpu操作(数据对齐)。所以我知道我可以在哪里使用矢量化,但我想我有一些内核,我无法做到这一点。我会手动编程,因为我不认为我的编译器能够看到它并进行向量化(特别是对于FIR/IIR操作)。你不能将它们实现为三个独立的内核而不是一个吗?