如何获得零的 VSX 值?

Posted

技术标签:

【中文标题】如何获得零的 VSX 值?【英文标题】:How to obtain a VSX value of zero? 【发布时间】:2017-09-09 05:49:58 【问题描述】:

我们在几个地方置换了一个向量,并且我们需要可区分的 0 值来与内置的 vec_perm 一起使用。我们无法找到vec_zero() 或类似的地址,所以我们想知道应该如何处理。

代码目前使用两种策略。第一种策略是向量加载:

__attribute__((aligned(16)))
static const uint8_t z[16] =
     0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0 ;

const uint8x16_p8 zero = vec_ld(0, z);

第二种策略是使用我们打算使用的掩码进行异或:

__attribute__((aligned(16)))
static const uint8_t m[16] =
     15,14,13,12,  11,10,9,8,  7,6,5,4, 3,2,1,0 ;

const uint8x16_p8 mask = vec_ld(0, m);
const uint8x16_p8 zero = vec_xor(mask, mask);

我们还没有开始基准测试,所以我们不知道一个是否比另一个更好。第一种策略使用 VMX 负载,它可能很昂贵。第二种策略避免了负载,但引入了数据依赖。

我们如何获得零 VSX 值?

【问题讨论】:

如果您只是以通常的方式将向量变量初始化为零(请注意,有两种不同的语法,具体取决于您使用的编译器),那么编译器通常会选择哪种方法更有效地将零喷到向量上。 您当然可以只使用 vec_splat 的直接形式来表示零值和其他小值。 【参考方案1】:

我建议让编译器为您处理它。只需初始化为零:

const uint8x16_p8 zero = 0;

- 可能会编译为xor

例如一个简单的测试:

vector char foo(void)

    const vector char zero = 0;
    return zero;

在我的机器上,编译为:

0000000000000000 <foo>:
   0:   d7 14 42 f0     xxlxor  vs34,vs34,vs34
   4:   20 00 80 4e     blr
    ...

【讨论】:

以上是关于如何获得零的 VSX 值?的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中获得总预订量为零的天数

如何使用 MS Access 中的从句获取 MAX 值

PHP如何获得POST传来的值?

如何获得 Spinner 值?

如何计算并获得音高的平滑值?

PHPUnit 如何获得模拟方法的真实返回值?