OpenCL:类型转换开销
OpenCL: Type conversion overhead
在 OpenCL 中将变量转换为不同类型的成本是多少?
示例: 我想取 2 int3
个向量的点积(AFAIK dot()
没有超载 int3
s) ,所以我不想以非向量化的方式自己实现 dot()
,而是想通过使用 float3
的原生 dot()
来向量化代码。首先,我将 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));
}
正如评论中所建议的那样,测量将成为实践中最有用的工具,单个指令的成本在很大程度上取决于硬件架构,还有编译器。
然而,与其他操作的比较是有用的,至少 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"。
在 OpenCL 中将变量转换为不同类型的成本是多少?
示例: 我想取 2 int3
个向量的点积(AFAIK dot()
没有超载 int3
s) ,所以我不想以非向量化的方式自己实现 dot()
,而是想通过使用 float3
的原生 dot()
来向量化代码。首先,我将 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));
}
正如评论中所建议的那样,测量将成为实践中最有用的工具,单个指令的成本在很大程度上取决于硬件架构,还有编译器。
然而,与其他操作的比较是有用的,至少 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"。