SIMD :在执行期间注册更改值
SIMD : registers changing value during execution
所以目前我的代码中发生了一些奇怪的事情,它是关于在某处计算期间分配的以下寄存器 __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
,即使它们来自同一个寄存器。知道这样的事情怎么会发生吗?
您的 for 循环的目的是访问 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;
}
所以目前我的代码中发生了一些奇怪的事情,它是关于在某处计算期间分配的以下寄存器 __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
,即使它们来自同一个寄存器。知道这样的事情怎么会发生吗?
您的 for 循环的目的是访问 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;
}