【问题标题】:fast compact register using sse使用 sse 的快速紧凑型寄存器
【发布时间】:2013-09-13 12:46:31
【问题描述】:

我正在尝试弄清楚如何使用 sse _mm_shuffle_epi8 来压缩 128 位寄存器。

假设我有一个输入变量

__m128i target

基本上是8个16位,表示为:

a[0], a[1] ... a[7].  // each slot is 16 bits

我的输出被调用:

__m128i output

现在我有一个大小为 8 的位向量:

char bit_mask // 8 bits, i-th bit each indicate if
              // the corresponding a[i] should be included

好的,如何根据bit_mask和输入目标得到最终结果?

假设我的位向量是:

[0 1 1 0 0 0 0 0]

那么我想要的结果是:

output = [a1, a2 , ... ]

任何已知的使用 _mm_shuffle_epi8 的方法?

假设我使用查找数组: _mm_shuffle_epi8(a, mask_lookup[bitvector]);

如何创建数组?

【问题讨论】:

  • 那么,您想从 8 个 16 位数字中的每一个中选出第 5 位?

标签: c++ sse sse4


【解决方案1】:

简单且非常快,但需要 4KB 的表空间:

_mm_shuffle_epi8(a, mask_lookup[bitvector]);

您只需将所有 256 个可能的 shuffle 掩码存储在由位向量索引的表中。

【讨论】:

  • 如何创建查找数组?我必须手动创建吗?
  • @WhatABeautifulWorld:一个理智的人会编写一个简单的程序来生成它。
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多