Optimization OpenCL:类型转换开销

Optimization OpenCL:类型转换开销,optimization,opencl,Optimization,Opencl,在OpenCL中将变量强制转换为不同类型的成本是多少 示例:我想取2int3向量的点积(对于int3s,AFAIKdot()不会重载),因此,我想通过使用float3的本机dot()来对代码进行向量化,而不是自己以不分区的方式实现dot()。首先,我将2个向量转换为float3s,然后将结果转换为int 这两个功能中,foo和bar哪一个耗时较少(为什么) 正如评论中所建议的那样,度量将是实践中最有用的工具,并且单个指令的成本在很大程度上取决于硬件体系结构,但也取决于编译器 然而,和其他操作的比

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

示例:我想取2
int3
向量的点积(对于
int3
s,AFAIK
dot()
不会重载),因此,我想通过使用
float3
的本机
dot()
来对代码进行向量化,而不是自己以不分区的方式实现
dot()
。首先,我将2个向量转换为
float3
s,然后将结果转换为
int

这两个功能中,
foo
bar
哪一个耗时较少(为什么)


正如评论中所建议的那样,度量将是实践中最有用的工具,并且单个指令的成本在很大程度上取决于硬件体系结构,但也取决于编译器

然而,和其他操作的比较是有用的,至少AMD在中发布了其设备的指令吞吐量列表,其中包括浮点到整数和整数到浮点的转换

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

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


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

@AndreasPapadopoulos我同意。顺便问一下,你知道一些更精细的评测方法吗?例如,查看每个内核命令的执行时间(比如苹果的Metal),而不仅仅是查看整个内核的执行时间?@AndreasPapadopoulos为了更好地说明这个想法,请看一看XCode。它显示花费在每行代码上的时间百分比。
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));
}