在std :: vector中存储__m256i仅在发布模式下产生访问冲突

时间:2016-07-08 12:49:03

标签: c++ debugging vector release avx2

快速掠过,我试图将AVX2数据(类型__m256i)存储在一个向量中:

__m256i values= _mm256_set_epi32(2, 4, 6, 8, 10, 12, 14, 16);

std::vector< __m256i > vecValues;

for ( int k = 0; k < static_cast< int >(100); k++ )
{
    vecValues.push_back( values);
}

使用VS2012,此在调试模式下工作,但在发布模式下运行时会出现“未处理的异常/访问冲突”。

有人可以解释,为什么以及如何正确存储数据?

1 个答案:

答案 0 :(得分:3)

__m256i类型保证在为堆栈上的值分配空间时将遵循特定的对齐方式。但是,当您将它们放在std::vector中时,会忽略该对齐注释 * 。您将需要使用一个尊重对齐要求的自定义分配器。这可能涉及在MSVC中使用_mm_malloc内在函数或调用_aligned_malloc

__m256i需要32字节对齐,因为它代表256位AVX2寄存器。默认情况下,MSVC只为您提供8字节对齐(对于32位构建)或16字节对齐(对于64位构建),这是不够的。当您尝试运行构建时,这会导致访问冲突崩溃。

Donny-Dont has shared a Gist提供了一个示例,说明如何编写自定义对齐感知分配器以在SIML容器中存储SIMD类型。你应该根据自己的目的进行调整。更多示例可以在this Stack Overflow question的答案中找到。

* GCC将为此发出编译时警告:
warning: ignoring attributes on template argument '__m256i {aka __vector(4) long long int}'
如果您使用-Wignored-attributes选项(由-Wall暗示)。但是,我在Clang看不到这样的警告。