OpenCL:类型转换开销

OpenCL: Type conversion overhead

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

示例: 我想取 2 int3 个向量的点积(AFAIK dot() 没有超载 int3s) ,所以我不想以非向量化的方式自己实现 dot(),而是想通过使用 float3 的原生 dot() 来向量化代码。首先,我将 2 个向量转换为 float3s,然后将结果转换为 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));
}

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

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

在您的具体情况下,我强烈怀疑您的 "vectorising" 尝试会产生不利影响。大多数现代 GPU 都不是 CPU SIMD 意义上的 SIMD 处理器。线程 运行 处于锁步状态,但每个线程都在标量上运行。 "horizontal" 像点积这样的操作可能不是特别有效,即使 GPU 确实使用每线程 SIMD。

如果您可以将每个整数的范围限制为 24 位,那么一系列 mad24()mul24() 调用很可能是最快的。但再次 - 测量。在一系列硬件上尝试不同的选项,运行 多次,应用基本统计数据以确保您看到的不是随机的 variation/overhead.

关于整数到浮点数的转换需要注意的另一件事是,当您从包含整数的图像对象中采样为浮点数时,此类转换通常 "free"。