OpenCL 杂项矢量函数

OpenCL 关系函数中,我们着重举例来说明bitselect()和select()函数。

在OpenCL中,还有一种通过掩码(mask)来确定输出结果的函数,这个函数就是shuffle()函数。在开始讲解shuffle()函数之前,我们对函数参数数据类型做一些约定:用通用类型名gentypen(或gentypem)指 示 这 些数学 函 数 参 数 可 以 取char{2|3|4|8|16}、uchar{2|3|4|8|16}、short{2|3|4|8|16}、ushort{2|3|4|8|16}、int{2|3|4|8|16}、long{2|3|4|8|16}、ulong{2|3|4|8|16}、f loat{2|3|4|8|16}和double{2|3|4|8|16},通用类型ugentypem表示内建的无符号整数数据类型。Shuff le()函数如下:

gentypen shuffle (gentypem x, ugentypen mask)
gentypen shuffle2 (gentypem x, gentypem y, ugentypen mask)

shuffle()和shuffle2()函数返回的都是一个矢量数据。对于shuffle()函数,返回矢量的分量来自于输入的矢量x;对于shuff le2()函数,返回矢量的分量来自于输入矢量x和y。返回矢量的分量到底来自于输入矢量的哪个分量,这 由 函 数 的 最 后 一 个 参 数mask确定。

mask参数的数据大小必须与函数返回的矢量数据大小相同,同时mask参数数据类型为无符号整数类型。Shuffle()函数返回的矢量数据类型与输入矢量x和y数据类型相同。

下面就通过两个例子来讲解shuffle用法,对于shuffle()函数的一个例子如下图所示:

shuffle()函数使用示例

上述例子中,使用shuff le()函数根据f loat4 input的矢量值,利用mask的值来创建一个f loat8的矢量。output当前分量的值根据当前mask分量值去读取对应位置上的input分量的值。那么当mask分量的值大于input中分量个数的值,这该如何处理呢?在OpenCL中,使用mask分量值的k位最低有效位(least signif icant bits)来确定读取input分量值。对于k的值,根据输入input矢量的分量个数n确定,k=log2n。对于上述例子,n=4,所以k=2。对于mask中的第0个分量值为5(二进制:101),取k=2位最低有效位的值为1(01),所以output第0个分量的值为0.5;其他分量依次类推可以得到最后的intput结果。

对于shuffle2()函数,使用示例如下图所示:

shuffle2函数使用示例

上述例子中,使用shuffle2()函数,根据char8类型的input1和input2的矢量值,利用mask的值来创建一个char16的矢量。运算过程与shuff le一样。只是输入矢量的分量个数n值为input1的分量个数加上input2的分量个数,结果为16。mask的最低有效位为4。对于mask中的第0个分量值,26(二进制:10110),取k=4位最低有效位的值为6(0110),所以output的第0个分量值为s;其他分量依次类推可以得到最后的intput结果。

上述两个示意图对应的内核代码为:

kernel void shuffle_tes(global float8 *s1, global char16 *s2)
{
    uint8 mask1 = (uint8)(5, 7, 0, 1, 3, 1, 2, 3);
    float4 input = (float4)(0.25f, 0.5f, 0.75f, 1.0f);
    *s1 = shuffle(input, mask1);
    uint16 mask2 = (uint16)(26, 10, 5, 2, 8, 0, 9, 14, 7, 5, 12, 3,
                                  11, 15, 1, 13)
    char8 input1 = (char8)('l', '0', 'f', 'c', 'a', 'u', 's', 'f');
    char8 input2 = (char8)('f', 'e', 'h', 't', 'n', 'n', '2', 'i');
    *s2 = shuffle2(intpu1, input2, mask2)
}

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程