加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 从阵列中对特定短路模式进行矢量化提取,并插入新阵列

发布时间:2020-12-16 07:03:05 所属栏目:百科 来源:网络整理
导读:我有一个短裤数组,我想抓住一半的值并将它们放在一个大小一半的新数组中.我想在这种模式中获取特定值,其中每个块是128位(8个短路).这是我将使用的唯一模式,它不需要是“任何通用模式”! 白色的值被丢弃.我的数组大小总是2的幂.这是模糊的想法,未实现: unsi
我有一个短裤数组,我想抓住一半的值并将它们放在一个大小一半的新数组中.我想在这种模式中获取特定值,其中每个块是128位(8个短路).这是我将使用的唯一模式,它不需要是“任何通用模式”!

白色的值被丢弃.我的数组大小总是2的幂.这是模糊的想法,未实现:

unsigned short size = 1 << 8;
unsigned short* data = new unsigned short[size];

...

unsigned short* newdata = new unsigned short[size >>= 1];

unsigned int* uintdata = (unsigned int*) data;
unsigned int* uintnewdata = (unsigned int*) newdata;

for (unsigned short uintsize = size >> 1,i = 0; i < uintsize; ++i)
{
 uintnewdata[i] = (uintdata[i * 2] & 0xFFFF0000) | (uintdata[(i * 2) + 1] & 0x0000FFFF);
}

我开始时有这样的事情:

static const __m128i startmask128 = _mm_setr_epi32(0xFFFF0000,0x00000000,0xFFFF0000,0x00000000);
static const __m128i endmask128 = _mm_setr_epi32(0x00000000,0x0000FFFF,0x0000FFFF);

__m128i* data128 = (__m128i*) data;
__m128i* newdata128 = (__m128i*) newdata;

我可以用掩码迭代地执行_mm_and_si128以获取我正在寻找的值,与_mm_or_si128结合,并将结果放在newdata128 [i]中.但是,我不知道如何将“压缩”在一起并删除白色的值.似乎我能做到这一点,我根本不需要面具.

怎么办?

无论如何,最终我也想要做与此操作相反的操作,并创建一个两倍大小的新数组并在其中展开当前值.

我还将在白色块中插入新值,我必须迭代地使用原始数据中的每对短路来计算.此计算不可矢量化,但结果值的插入应该是.我怎样才能将当前值“展开”到新数组中,插入计算值的最佳方法是什么?我应该为每个128位迭代计算它们并将它们放入它们自己的临时块(64位?128位?),然后做一些大量插入的东西?或者它们应该直接放入我的目标__m128i,因为看起来成本应该相当于放入一个临时值?如果是这样,怎么能在不搞乱我的其他价值的情况下做到这一点?

我最喜欢使用SSE2操作.

解决方法

这是您可以尝试的大纲:

>使用交错指令(_mm_unpackhi / lo_epi16)和一个包含零的寄存器来“展开”您的16位值.现在你将有两个看起来像B_R_B_R_的寄存器.
>右移创建_B_R_B_R
>和R的第一个版本B___B___
>和B出第二个版本___R___R
>或者一起B__RB__R

在另一个方向上,在使用shift /和/或设置后,最后使用_mm_packs_epi32.

每个方向应该是10个SSE指令(不计算常量设置,零和AND掩码,以及加载/存储).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读