首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用`__m256i`的值有效地访问数组- SIMD

使用`__m256i`的值有效地访问数组- SIMD
EN

Stack Overflow用户
提问于 2017-08-07 20:04:53
回答 1查看 1.2K关注 0票数 5

例如,假设我有两个名为__m256icols的变量,它们中的值是:

代码语言:javascript
复制
rows: 0, 2, 7, 5, 7, 2, 3, 0
cols: 1, 2, 7, 5, 7, 2, 2, 6

现在,这些值表示8点的xy位置,因此,在本例中,我将得到以下几个点:

代码语言:javascript
复制
p0: [0, 1], p1: [2, 2], p2: [7, 7], p3: [5, 5]
p4: [7, 7], p5: [2, 2], p6: [3, 2], p7: [0, 6]

我还有一个名为lut的数组,它的值为int类型:

代码语言:javascript
复制
lut: [0, 1, 2, 3, ..., 60, 61, 62, 63]

我想要做的是使用rowscols变量中的这些位置值,使用它访问lut数组,并使用lut访问的值创建一个新的__m256i值。

我所知道的方法是将rowscols值存储在大小为8的两个int数组中,然后一次从lut数组读取值,然后使用_mm256_set_epi32()创建新的_m256i值。

这是可行的,但在我看来是非常低效的。所以我的问题是,是否有更快的方法来做到这一点。

请注意,这些值只是一个更具体的示例,lut不需要有有序的值或大小为64。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-07 21:04:51

您可以使用avx2集合指令构建解决方案,如下所示

代码语言:javascript
复制
// index = (rows << 3) + cols;
const __m256i index = _mm256_add_epi32( _mm256_slli_epi32(rows, 3), cols);
// result = lut[index];
const __m256i result = _mm256_i32gather_epi32(lut, index, 4);

请注意,在当前CPU上,收集指令有相当大的延迟,所以除非您能够在实际使用result之前交织一些指令,否则这可能不值得使用。

解释4的因子:scale因子

代码语言:javascript
复制
__m256i _mm256_i32gather_epi32 (int const* base_addr, __m256i vindex, const int scale)

被视为实际字节偏移量,即每个索引的返回值为:

代码语言:javascript
复制
*(const int*)((const char*) base_addr + scale*index)

我不知道这种行为是否有很多用例(也许这是为了能够访问带有1字节或2字节条目的LUT (之后需要一些掩蔽))。也许这只是允许的,因为扩展4是可能的,而缩放1/4或1/2是不可能的(如果有人真的需要的话)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45554873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档