SIMD:在执行期间记录更改值

时间:2018-01-25 04:19:13

标签: c++ x86 simd intrinsics avx2

目前我的代码中发生了一些奇怪的事情,它是关于在某个计算过程中分配的以下寄存器__m256i local,以及与本地无关的__m256i mask

运行以下内容:

  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;`

我为第一个输出获取519, 519, 519, 519, 519, 519, 519, 519,为第二个输出获得0, 0, 0, 0, 0, 0, 0, 0,即使它们来自同一个寄存器。知道这样的事情怎么会发生?

1 个答案:

答案 0 :(得分:4)

for-loop的意图是访问256位mask向量中的32位字吗?这不是正确的方法。当您使用下标运算符访问mask时,编译器会超出内存中实际mask变量的位置,并破坏其后续的7x 256字节区域。

如果您想轻松访问mask中的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;
}