c++ - SIMD : registers changing value during execution

标签 c++ x86 simd intrinsics avx2

所以目前我的代码中发生了一些奇怪的事情,它是关于以下寄存器 __m256i local,在某处的计算期间分配的,以及 __m256i 掩码,这与本地无关。

运行以下代码的地方:

  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 第二个,即使它们来自同一个寄存器。知道这样的事情怎么会发生吗?

最佳答案

您的 for 循环的目的是访问 256 位 mask vector 中的 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;
}

关于c++ - SIMD : registers changing value during execution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48435628/

相关文章:

c++ - SSE 和 AVX 内在函数混合

performance - 为什么当我的循环包含在一个缓存行中时,它会快得多?

c - 如何优化阀门仿真逻辑?

c - __builtin_clz 的实现

c++ - 在 Visual Studio 中将 C++ .lib 的调试与发布结合起来

assembly - 如何在 tasm 中在屏幕上打印 SVGA 信息?

linux-kernel - 有没有办法让内核模块找到另一个加载模块的节地址?

c++ - 试图理解 boost 示例 httpserver3。 shared_ptr 重置方法不清楚

c++ - 数组中的函数指针(nix c++)

c++ - 如何检查数组索引是否存在