C++ SIMD:在执行期间更改值的寄存器

C++ SIMD:在执行期间更改值的寄存器,c++,x86,simd,intrinsics,avx2,C++,X86,Simd,Intrinsics,Avx2,所以现在我的代码中发生了一些奇怪的事情,它是关于以下寄存器\uuuuum256i local,在某个地方的计算过程中分配,以及\uuuuuum256i mask,它与local无关 其中运行以下命令: std::cout << _mm256_extract_epi32 (local, 0) << ", " << _mm256_extract_epi32(local,1) << ", " << _mm256_extract_epi32

所以现在我的代码中发生了一些奇怪的事情,它是关于以下寄存器
\uuuuum256i local
,在某个地方的计算过程中分配,以及
\uuuuuum256i mask
,它与local无关

其中运行以下命令:

  std::cout << _mm256_extract_epi32 (local, 0) << ", " << _mm256_extract_epi32(local,1) << ", " << _mm256_extract_epi32(local,2) << ", " << _mm256_extract_epi32(local,3) << ", " << _mm256_extract_epi32(local,4) << ", " << _mm256_extract_epi32(local,5) << ", " << _mm256_extract_epi32(local,6) << ", " << _mm256_extract_epi32(local,7) << std::endl;

  for (int l = 0; l < 8; ++l)
  {
    if (mask[l]) mask[l] = 0; else mask[l] = 1;
  }
  std::cout << _mm256_extract_epi32 (local, 0) << ", " << _mm256_extract_epi32(local,1) << ", " << _mm256_extract_epi32(local,2) << ", " << _mm256_extract_epi32(local,3) << ", " << _mm256_extract_epi32(local,4) << ", " << _mm256_extract_epi32(local,5) << ", " << _mm256_extract_epi32(local,6) << ", " << _mm256_extract_epi32(local,7) << std::endl;`

std::coutfor循环的目的是访问256位
mask
向量中的32位字吗?那不是正确的方法。当您使用下标运算符访问
掩码
时,编译器会溢出内存中实际
掩码
变量的位置,并对其后面的7x 256字节区域进行填充

如果要轻松访问
掩码
中的32位字,请尝试将其声明为:

union vec8x32_t
{
  __m256i  vector;
  uint32_t words[8];
};

vec8x32_t mask;
然后你可以像这样做:

// Do some AVX thing with mask:
mask.vector = _mm256_set_epi32(0, 1, 0, 1, 0, 1, 0, 1);

// Manipulate the components of mask:
for (int l = 0; l < 8; ++l)
{
  if (mask.words[l]) mask.words[l] = 0; else mask.words[l] = 1;
}
//使用掩码执行一些AVX操作:
mask.vector=_mm256_set_epi32(0,1,0,1,0,1);
//操纵遮罩的组件:
对于(int l=0;l<8;++l)
{
if(mask.words[l])mask.words[l]=0;else mask.words[l]=1;
}

这不是一个简单的函数,因为它缺少
local
mask
的定义,包括这些变量是如何获取其值的。OP的代码不会编译。如果您查看
\uuu m256i
(它在
中)的定义,您会发现它已经是一个并集,您的并集是不必要的。@1201程序,这似乎与编译器有关。我确实在MSVC 2015中看到了这个定义,但GCC 7没有提供它,抱怨:
错误:请求“mask”中的成员“m256i_u32”,它是非类类型“u m256i{aka uuu vector(4)long long int}”。
那么GCC没有使用标准的英特尔头。叹气