所以我读了英特尔的about _mm_blendv_ps文档,但不太明白这个函数到底是做什么的,所以我写了下面的代码:
__m128 a = { 18.0,4.0,19.0,21.0 };
__m128 b = { 67.0,92.0,888.0,47.0 };
__m128 mask = { 1.0,0.0,0.0,1.0 };
__m128 result = _mm_blendv_ps(a, b, mask);
cout << "Result is: " << result[0] << " " << result[1] << " " << result[2] << " " << result[4] << endl;
但是我得到错误“没有operator []匹配这些操作数”。为什么我不能访问result?result不是一个32位浮点向量吗?。
那么为什么我不能访问结果呢?我怎么能访问它呢?还有结果cout会是什么(blendv做什么)?
1条答案
按热度按时间z0qdvdin1#
Blendv使用最高设置位在两个结果之间进行选择,它相当于以下代码:
实际上我倾向于将其打包,因为参数顺序与标准
if(cmp) { true } else { false };
稍有不同通常,您将使用此命令执行
if(a < b) {} else {}
类型的操作,例如在你上面贴出的代码中:
1.0的最高位实际上是零,所以你需要一个负数来使掩码工作,例如。
只查看符号位的好处是,您可以执行某些if/else操作,而无需使用比较指令,例如
至于访问__m128的内容,这通常不是跨平台的(有些编译器重载数组运算符,有些指定.x/. y等,有些有内部联合成员变量)。因此,如果你想在跨平台方法中访问内容,你有两个选择:
1.正如Peter正确指出的那样,不要使用
_mm_extract_ps
,使用_mm_cvtss_f32
进行 Shuffle 。1.使用
_mm_store_ps
但是,不管您怎么做,访问XMM寄存器的元素总是要付出代价的(当然,除了[0]),所以一般的规则是尽可能避免这样做!