OpenCL学习笔记(20)--混洗和选择函数、向量测试函数、几何函数

1.OpenCL的混洗函数的参数输入为一个或两个输入向量,输出得到的向量包含输入向量的分量。

(1)allm shuffle(alln x, uintegerm mask); --创建一个向量,其中包含x的分量,顺序由mask来确定。
(2)allm shuffle2(alln x, alln y, uintgerm mask); --创建一个向量,其中包含x和y的分量,顺序由mask来确定。

shuffle函数创建一个向量,其中的分量来自输入向量x。shuffle创建一个向量,其中的分量来自向量x和向量y.两个函数的最后一个参数是屏蔽向量。这个向量决定了那些输入分量会被放到输出之中,以及他们的放置顺序。

屏蔽向量中分量的大小必须和返回向量的大小一样。但是屏蔽分量的数据类型必须是无符号型整数(uchar,ushort,uInt或ulong).返回的向量所含的分量数量和屏蔽向量的分量数量相同,但是返回分量的数据类型却是由输入向量的各个分量来决定。
k的取值与输入向量的分量数有关。如果输入向量有n个分量,那么,shuffle函数的k=log2n,即n=2K.对于shuffle函数而言,k=log2 2n,和n=2的k-1次方。

假设你想用shuffle函数,通过float4型分量来创建float8型向量。返回的向量中就会有8个分量,所以。屏蔽向量中也必须有8个分量。输出向量的每个分量都是32位宽,所以屏蔽向量中各个分量也都必须是32位宽。所以,屏蔽向量必须是uint8型向量。

shuffle2函数和shuffle函数很相似,但和后者只接受一个输入向量不同,shuffle2函数需要两个输入向量。假设,需要从两个char8型向量中选出一部分字符,放到char16型向量中。这样的话,屏蔽向量就需要包含16个分量,每个屏蔽分量都必须是1个字节,所以,屏蔽分量必须是uchar16型向量。

主机应用程序为混洗数据创建了只写缓存,然后从设备读回处理结果并打印输出。

2.选择函数:bitselect函数和select函数都与shuffle2函数很接近,他们都是通过两个输入向量来创建得到新的向量。所不同的是select函数和bitselect函数借助的是屏蔽向量中单个的位,而非分量索引。
(1)alln bitselect(alln a, alln b, u/integern mask)–根据mask中的位来选择a和b中的对应位。
(2)alln select(alln a, alln b, u/integern mask)–根据mask中的MSBs来选择a和b中的对应分量。

与shuffle和shuffle2中的屏蔽向量不同,bitselect和select中的屏蔽向量的分量可以是有符号型或无符号型整数。以select函数为例,只有各个向量分量的最高位起作用。如果向量分量的最高位为0,那么对应的输出向量分量将会是第一个输入向量,如果MSB等于1,那么输出分量就会来自第二个输入向量。

有了bitselect函数,屏蔽向量的每一位都能发挥作用,如果屏蔽位为0,第一个的对应位被作为输出,如果屏蔽位为1,第二个输入的对应位白作为输出。屏蔽向量中的分量之间的区别并不重要,唯一要紧的事就是位的先后顺序。对输出向量的各位亦是如此。select函数和bitselect函数的屏蔽分量可以通过使用像<,>,和==这样的向量关系操作符来创建得到。

3.向量测试函数:向量的函数分析的是向量的内容,返回的是它各个分量的信息。有些函数针对的是float型向量。而有些则考虑的是整型向量。但其中的vec_step函数可以用来处理任意类型的向量。
int vec_step(alln) --返回向量中分量的数量;如果有3个元素,返回4.
(1)isgreater(5.5f,4.5f)返回1;
(2)islessequal(2.3f,-2.3f)返回0;
(3)isnan(nan(0))返回1;
(4)signbit(-10.0)返回1;
(5)isnormal((float3)(rsqrt(2.0),rsqrt(2.0),0.0)返回(-1,-1,0).
最后一个函数isnormal表示的是输入向量的各个分量是否都是正规化的(非0,非正规化,无穷量,或是NaN)。注意,对于向量而言,比较操作用-1,而非1来表示真。这是因为-1的补码为全零,非常适合用来做向量的位屏蔽。

4.几何函数:两个向量的点积是一个标量,反映的是两个向量在方向上相近的程度。如果点积为整数,他们的指向会很接近,点积为0,说明两个向量相互垂直,如果点积为负数,说明两个向量指向相反。点积的计算方法是先对两个向量的对应分量分别相乘,然后再将这些乘积求和即可。例如:
如果向量p的分量分别为p.x,p.y,p.z,向量q的分量分别为q.x,q.y,q.z,那么,两个向量的点积可以表示为:
pq=(p.xq.x)+(p.yq.y)+(p.zq.z)

5.小结:
(1)OpenCL的操作符和函数所处理的操作数既可以是标量,也可以是向量。通过调用向量运算函数,可以极大的降低处理数据所需的时间。OpenCL函数通常都是内核函数首先被调用的,因为它们可以返回工作项的全局ID和局部ID等信息。全局ID可以将工作项和同意内核上执行的其他 工作项区别开。而局部ID则可以将工作项和同一工作组中的其他工作项区别开来。
(2)OpenCL并没有所谓的进位标志或溢出标志,因而了解结果溢出时,函数的饱和值返回处理就显得异常的重要。如果想要得到两个整数的完整乘积,就一定需要将mul_hi函数的返回值与操作符*的计算结果结合起来考虑。

发布了19 篇原创文章 · 获赞 20 · 访问量 588

猜你喜欢

转载自blog.csdn.net/INFINALGEORGE/article/details/105218556