作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:我有 4 个 256 位 AVX2 vector (A、B、C、D),我需要执行它们各自的 128 位部分以及两个不同 vector 之间的交换操作。这是我需要做的转换。
Original Transformed
|| Low Lane || High Lane|| || Low Lane || High Lane||
A = || L1 || H1 || = > || L1 || L2 ||
B = || L2 || H2 || = > || H1 || H2 ||
C = || L3 || H3 || = > || L3 || L4 ||
D = || L4 || H4 || = > || H3 || H4 ||
// (a, c) = block0, (b, d) = block1
a = Avx2.Permute2x128(a, a, 1);
var template = Avx2.Blend(a, b, 0b1111_0000); // H1 H2
a = Avx2.Blend(a, b, 0b0000_1111); // L2 l1
a = Avx2.Permute2x128(a, a, 1); // L1 l2
b = template;
c = Avx2.Permute2x128(c, c, 1);
template = Avx2.Blend(c, d, 0b1111_0000); // H3 H4
c = Avx2.Blend(c, d, 0b0000_1111); // L4 L3
c = Avx2.Permute2x128(c, c, 1); // L3 l4
d = template;
// Store keystream into buffer (in corrected order = [block0, block1])
Avx2.Store(outputPtr, a);
Avx2.Store(outputPtr + Vector256<uint>.Count, c);
Avx2.Store(outputPtr + Vector256<uint>.Count * 2, b);
Avx2.Store(outputPtr + Vector256<uint>.Count * 3, d);
var tmp = Avx2.Permute2x128(a, b, 0x20);
b = Avx2.Permute2x128(a, b, 0x31);
a = tmp;
tmp = Avx2.Permute2x128(c, d, 0x20);
d = Avx2.Permute2x128(c, d, 0x31);
c = tmp;
最佳答案
如果我理解正确,我认为您可以在没有此 2x4 转置的混合指令的情况下离开,创建选择所需车道的新变量。就像是:
__m256i a; // L1 H1
__m256i b; // L2 H2
__m256i c; // L3 H3
__m256i d; // L4 H4
__m256i A = _mm256_permute2x128_si256(a, b, 0x20); // L1 L2
__m256i B = _mm256_permute2x128_si256(a, b, 0x31); // H1 H2
__m256i C = _mm256_permute2x128_si256(c, d, 0x20); // L3 L4
__m256i D = _mm256_permute2x128_si256(c, d, 0x31); // H3 H4
vperm2i128
的 3 个周期延迟指令,但是当您有数据跨越 128 位 channel 时,您总是会拥有该指令。这 4 个 shuffle 是独立的,因此它们可以流水线化(ILP); Intel 和 Zen 2 的吞吐量为 1/clock
vperm2i128
(
https://agner.org/optimize/ ,
https://uops.info/ )。
vinserti128
AMD Zen 1 的运行效率更高(1 uop 而不是 8;跨车道洗牌被分成多个 128 位 uop。)
vpblendd
),从而消耗更多的前端吞吐量。相关:
What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?
关于c# - 如何在两个 AVX2 vector 之间交换 128 位部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61866755/
我是一名优秀的程序员,十分优秀!