shu*_*nyo 1 parallel-processing gpu opencl
此文章谈论的代码,并讨论了指令级并行优化。他们给出了GPU向量数学的示例,其中float4向量数学可以在向量上执行,而不是在单个标量上执行。给出的例子:
float4 x_neighbor = center.xyxy + float4(-1.0f, 0.0f, 1.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,它是否也可以用于比较?因此,在简化示例中,我可以这样做:
accumulator.xyz = (accumulator.xyz < element.xyz) ? accumulator.xyz : element.xyz;
Run Code Online (Sandbox Code Playgroud)
谢谢。
正如奥斯丁已经说过的,比较运算符也适用于向量。
d。本标准第6.3节中的内容是与您相关的部分。它说:
大于(>),小于(<),大于或等于(> =)和小于或等于(<=)的关系运算符对标量和向量类型进行运算。
它也解释了有效的情况:
这两个操作数是标量。(...)
一个操作数是标量,另一个是向量。(...)然后,将标量类型扩展为一个向量,该向量具有与向量操作数相同的分量。该操作按组件进行,从而得到相同大小的向量。
这两个操作数是相同类型的向量。在这种情况下,该操作以组件方式完成,从而得到相同大小的向量。
最后,这些比较运算符返回什么:
如果源操作数是标量,则结果为int类型的标量有符号整数;如果源操作数是矢量类型,则结果为与源操作数大小相同的向量有符号整数类型。
对于标量类型,如果指定的关系为false,则关系运算符应返回0,如果指定的关系为true,则关系运算符应返回1。对于向量类型,如果指定的关系为假,则关系运算符应返回0;如果指定的关系为真,则关系运算符应返回–1(即,所有位均已设置)。如果两个参数都不是数字(NaN),则关系运算符始终返回0。
编辑:
为了完成一点返回值部分,尤其是在@redrum的注释之后;起初,向量类型的真实值为-1似乎很奇怪。但是,由于OCL的行为尽可能像C,因此并没有太大的变化,因为所有不等于0的都是正确的。
例如,您有矢量:
int2 vect = (int2)(0, -1);
Run Code Online (Sandbox Code Playgroud)
该语句将评估为true并执行以下操作:
if(vect.y){
//Do something
}
Run Code Online (Sandbox Code Playgroud)
现在,请注意,这是无效的(与返回的值无关,而仅与它是向量有关):
if(vect){
//do something
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,但是,您可以使用该函数all并any在“ if语句”中评估向量的所有元素:
if(any(vect){
//this will evaluate to true in our example
}
Run Code Online (Sandbox Code Playgroud)
请注意,返回的值是(从快速参考卡):
int any (Ti x): 1 if MSB in component of x is set; else 0
Run Code Online (Sandbox Code Playgroud)
因此,任何负数都可以。
但是,当评估为true时,为什么不保留1作为返回值呢?
我认为重要的是所有位均已设置。我的猜测是,这样一来,您可以轻松地对向量进行按位运算,例如您想消除小于给定值的元素。由于值“ true”为-1,即111111 ... 111,因此您可以执行以下操作:
int4 vect = (int4)(75, 3, 42, 105);
int ref = 50;
int4 result = (vect < ref) & vect;
Run Code Online (Sandbox Code Playgroud)
结果的元素将是:0、3、42、0
另一方面,如果返回值为true表示1,则结果将是:0、1、0、0