Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 改进AVX中的非水平赋值_C++_X86_Simd_Avx - Fatal编程技术网

C++ 改进AVX中的非水平赋值

C++ 改进AVX中的非水平赋值,c++,x86,simd,avx,C++,X86,Simd,Avx,所以我在处理AVX代码时遇到了另一个问题。我有一个例子,我有4个ymm寄存器,需要垂直拆分为4个其他ymm寄存器 (即ymm0(ABCD)->ymm4(A…)、ymm5(B…)、ymm6(C…)、ymm7(D…) 以下是一个例子: // a, b, c, d are __m256 structs with [] operators to access xyzw __m256d A = _mm256_setr_pd(a[0], b[0], c[0], d[0]); __m256d B = _mm2

所以我在处理AVX代码时遇到了另一个问题。我有一个例子,我有4个ymm寄存器,需要垂直拆分为4个其他ymm寄存器

(即ymm0(ABCD)->ymm4(A…)、ymm5(B…)、ymm6(C…)、ymm7(D…)

以下是一个例子:

// a, b, c, d are __m256 structs with [] operators to access xyzw
__m256d A = _mm256_setr_pd(a[0], b[0], c[0], d[0]);
__m256d B = _mm256_setr_pd(a[1], b[1], c[1], d[1]);
__m256d C = _mm256_setr_pd(a[2], b[2], c[2], d[2]);
__m256d D = _mm256_setr_pd(a[3], b[3], c[3], d[3]);

只是把保罗的评论放在一个答案中:

我的问题是如何在AVX中轻松完成矩阵转换,如他提供的链接所示

以下是我为那些在这里遇到的人提供的实施方案:

void Transpose(__m256d* A, __m256d* T)
{
    __m256d t0 = _mm256_shuffle_pd(A[0], A[1], 0b0000);
    __m256d t1 = _mm256_shuffle_pd(A[0], A[1], 0b1111);
    __m256d t2 = _mm256_shuffle_pd(A[2], A[3], 0b0000);
    __m256d t3 = _mm256_shuffle_pd(A[2], A[3], 0b1111);
    T[0] = _mm256_permute2f128_pd(t0, t2, 0b0100000);
    T[1] = _mm256_permute2f128_pd(t1, t3, 0b0100000);
    T[2] = _mm256_permute2f128_pd(t0, t2, 0b0110001);
    T[3] = _mm256_permute2f128_pd(t1, t3, 0b0110001);
}

与我之前的尝试相比,此函数在完全优化时将指令数量减少了一半左右

从a、b、c、d加载4个连续向量,然后执行4x4转置(这可以非常有效地实现-请参阅)。@PaulR感谢链接。我不知道我在问如何做矩阵的4x4转置。