在OpenCL中将变量转换为其他类型的成本是多少?
示例:我想采用2 int3
个向量的点积(AFAIK dot()
没有为int3
s重载,所以不是实现dot()
我自己以非传播的方式,我希望使用dot()
的原生float3
来对代码进行矢量化。首先,我将2个向量转换为float3
s,然后将结果转换为int
。
foo
和bar
这两个函数中的哪一个耗时较短(以及为什么)?
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));
}
答案 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()
次呼叫最有可能是最快的。但再次 - 措施。在一系列硬件上尝试不同的选项,并运行很多次,应用基本统计数据以确保您不仅仅看到随机变化/开销。
有关整数到浮点转换的另一个注意事项是,当您从包含整数的图像对象中采样为浮点数时,此类转换通常是“空闲的”。