我正在使用AVX2内部,并希望获得以下信息:

输入:[1,2,3,4,5,6,7,8]

输出:[8,1,2,3,4,5,6,7]

以下代码适用于128位向量:

let vec1 = _mm_set_epi32(1,2,3,4);
let vec2 = _mm_alignr_epi8(vec1, 4); // shift values one position, catch at bottom

Ve1会给[1,2,3,4] Ve2会给[4,1,2,3]分. 这不出所料.

具有256位向量

let vec256_1 = _mm256_set_epi32(1,2,3,4,5,6,7,8);
let vec256_2 = _mm256_alignr_epi8(vec256_1, 4); // shift values one position

Vec256_1将给[1,2,3,4,5,6,7,8] Vec256_2将给[4,1,2,3,8,5,6,7]

所以在我看来,它在低位和高位部分都在做128位版本.

我的问题是:我如何做到这一点,从而使整个256位向左移动一个值?

目标:如何获得以下载体:[8,1,2,3,4,5,6,7]

推荐答案

如果您负担得起一个常量向量,请执行以下操作:

__m256i rotate1( __m256i v )
{
    const __m256i perm = _mm256_setr_epi32( 7, 0, 1, 2, 3, 4, 5, 6 );
    return _mm256_permutevar8x32_epi32( v, perm );
}

如果你宁愿不加载内存,这里有另一个版本,它可以在两条指令中完成你想要的事情:

__m256i rotate2( __m256i v )
{
    // Make another vector with 16-byte pieces flipped
    __m256i flipped = _mm256_permute2x128_si256( v, v, 0x01 );
    // With these two vectors, `vpalignr` can rotate the complete input
    return _mm256_alignr_epi8( v, flipped, 12 );
}

Rust相关问答推荐

如何从polars DataFrame中获取一个列作为Option String?<>

PyReadonlyArray2到Vec T<>

关联类型(类型参数)命名约定

返回的future 不是`发送`

如何将像烫手山芋一样不透明的值从一个Enum构造函数移动到下一个构造函数?

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

我应该将哪些文件放入我的GitHub存储库

如何将单个 struct 实例与插入器一起传递到Rust中的映射

零拷贝按步骤引用一段字节

解析程序无法在Cargo 发布中 Select 依赖版本

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

从 HashMap>, _> 中删除的生命周期问题

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

改变不实现克隆的 dioxus UseState struct

`map` 调用在这里有什么用吗?

如何在 C++ 和 Rust 之间共享 pthread 同步原语?

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

如何在 Rust 的内置函数上实现特征?

为什么一个整型变量赋值给另一个变量后仍然可以使用?