OpenCL:类型转换开销

时间:2016-08-01 23:53:25

标签: optimization opencl

在OpenCL中将变量转换为其他类型的成本是多少?

示例:我想采用2 int3个向量的点积(AFAIK dot()没有为int3 s重载,所以不是实现dot()我自己以非传播的方式,我希望使用dot()的原生float3来对代码进行矢量化。首先,我将2个向量转换为float3 s,然后将结果转换为int

foobar这两个函数中的哪一个耗时较短(以及为什么)?

inline int foo(int3 a, int3 b) {
  return a.x*b.x + a.y*b.y + a.z*b.z;
}

inline int bar(int3 a, int3 b) {
  return (int)dot(convert_float3(a), convert_float3(b));
}

1 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,测量将成为实践中最有用的工具,单个指令的成本在很大程度上取决于硬件架构,也取决于编译器。

尽管如此,与其他操作的比较很有用,至少AMD会在this section of their OpenCL optimisation guide中发布其设备的指令吞吐量列表,其中包括float-to-int和int-to-float转换。

在您的特定情况下,我强烈怀疑您的“矢量化”尝试会产生不利影响。大多数现代GPU都不是CPU SIMD意义上的SIMD处理器。线程以锁步方式运行,但每个线程都在标量上运行。即使GPU确实使用每线程SIMD,像点积这样的“水平”操作也可能不是特别有效。

如果您可以将每个整数的范围限制为24位,则一系列mad24()mul24()次呼叫最有可能是最快的。但再次 - 措施。在一系列硬件上尝试不同的选项,并运行很多次,应用基本统计数据以确保您不仅仅看到随机变化/开销。

有关整数到浮点转换的另一个注意事项是,当您从包含整数的图像对象中采样为浮点数时,此类转换通常是“空闲的”。