2016-08-01 39 views
1

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

实施例:我想利用的,以便代替由自己在unvectorized方式实施dot()的2个int3载体(AFAIK dot()未过载为int3多个)点积,我要通过使用向量化的代码原产地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)); 
} 
+0

优化的第一条规则:测量。第二优化规则:再次测量。这完全取决于硬件和架构。没有人可以对你的问题给出明确的答案。 –

+0

@AndreasPapadopoulos我同意。顺便说一下,你是否知道一些更精细的剖析方法 - 即查看内核的每个单独命令(类似于Apple的Metal)的执行时间,而不是只看到整个内核的执行时间? – sarasvati

+0

@AndreasPapadopoulos为了更好地说明这个想法,请在XCode中查看[this profiling session image](https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Art/xcode_gpu_overview_program_2x.png) 。它显示了每行代码花费的时间百分比。 – sarasvati

回答

1

正如在评论中有人提出,测量将是在实践中最有用的工具,和各指令的成本在很大程度上依赖于硬件架构,而且编译器。尽管如此,与其他操作的比较是有用的,至少AMD公布了其设备的指令吞吐量列表,其中this section of their OpenCL optimisation guide包括float-to-int和int-to-float转换。

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

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

关于整数到浮点转换的另一个需要注意的事情是,当您从包含整数的图像对象中采样浮点数时,此类转换通常是“自由”的。