gpt4 book ai didi

c++ - 从四个 __m128i 变量的 64 高位或低位初始化 __m256i

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:05 25 4
gpt4 key购买 nike

假设我有四个 __m128i 变量,其中包含一些计算产生的数据。例如,让我们说:

__m128i a = _mm_set_epi64x(1, 11);
__m128i b = _mm_set_epi64x(2, 22);
__m128i c = _mm_set_epi64x(3, 33);
__m128i d = _mm_set_epi64x(4, 44);

我想初始化两个 __m256i 变量,其中第一个包含四个变量的所有高 64 位,第二个包含每个变量的低 64 位。所以我想要:

__m256i x = ...; // x = { 4, 3, 2, 1 };
__m256i y = ...; // y = { 44, 33, 22, 11 };

这样做的明显方法是使用 _mm256_set_epi64x_mm_extract_epi64。但是,它可能不是特别快。有更快的方法吗?特别是,对于访问高 64 位,我没有看到合适的负载(SSE2 中有低 64 位的负载)或随机播放指令(似乎没有“64 位随机播放”)。

最佳答案

如果我没听错的话,这是一个简单的 4x2 转置(或 2x4 转置?)。

这是对我有用的代码:

#include <iostream>
#include <immintrin.h>

using namespace std;
int main() {
__m128i a = _mm_set_epi64x(1, 11);
__m128i b = _mm_set_epi64x(2, 22);
__m128i c = _mm_set_epi64x(3, 33);
__m128i d = _mm_set_epi64x(4, 44);

__m256i ac = _mm256_castsi128_si256(a);
ac = _mm256_inserti128_si256(ac, c, 1); // {3, 33, 1, 11}

__m256i bd = _mm256_castsi128_si256(b);
bd = _mm256_inserti128_si256(bd, d, 1); // {4, 44, 2, 22}

__m256i high = _mm256_unpackhi_epi64(ac, bd);
__m256i low = _mm256_unpacklo_epi64(ac, bd);

uint64_t t[4];

_mm256_storeu_si256((__m256i*) t, high);

for (int i = 0; i < 4; ++i) {
cout << t[i] << endl;
}

_mm256_storeu_si256((__m256i*) t, low);

for (int i = 0; i < 4; ++i) {
cout << t[i] << endl;
}

return 0;
}

这应该编译成 4 条指令。

关于c++ - 从四个 __m128i 变量的 64 高位或低位初始化 __m256i,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com