OpenCL:如何避免重复的标量向量函数?

问题描述 投票:0回答:1

OpenCL内置数学函数接受抽象的 gentype 作为参数类型,所以你只有一个 exp(x)log(x) 函数,当你调用它们时,编译器会根据实际参数类型自动切换到正确的函数。

我需要编写其他数学函数,这些函数将执行一组基本的代数运算,如 (log(a / b) - c) / d (没有垂直向量代数),但有时对 float 标量,有时在 float4 向量。有没有一种干净的方法可以只写一次代码,让编译器根据参数类型来切换?

或者,如果我只写 float 标量代码,并在一个 float4 来应用它,编译器是否能够将它矢量化?

kernel opencl
1个回答
1
投票

OpenCL 是基于C编程语言的,我认为避免每种类型代码重复的唯一方法就是使用C式宏。

使用它们的方法之一是为类型设置宏,例如像这样。

#define vt(t,s) t##s
#define vector_type(t,s) vt(t,s)

typedef vector_type(float, VECTOR_SIZE) vfloat;

再比如 VECTOR_SIZE=4 可以传递给编译器使用 float4. 但这只适用于矢量类型。要使用 floatfloat4 需要稍微不同的宏。

另外,如果我只写浮标量代码,然后循环应用float4,编译器是否能够将其矢量化?

可能会,也可能不会,这取决于很多东西。而且OpenCL编译器并不像gcc那样先进,可能不会在你期望的时候生成矢量化的代码。唯一能知道的方法就是尝试。


0
投票

在英特尔Neo和Nvidia OpenCL上,使用LLVM 10和Clang 10,只使用一个标量函数,并在需要时在每个向量元素上展开,似乎没有产生任何减速,与完整的向量路径相比(虽然不确定哪个编译器是什么)。

所以看起来标量代码在需要的时候会被适当的矢量化,我不需要手动维护一个特定的矢量化路径。

© www.soinside.com 2019 - 2024. All rights reserved.