仅在发布模式下将 __m256i 存储在 std::vector 中会产生访问冲突[重复]

     2023-03-06     94

关键词:

【中文标题】仅在发布模式下将 __m256i 存储在 std::vector 中会产生访问冲突[重复]【英文标题】:store __m256i in std::vector yields access violation only in release mode [duplicate] 【发布时间】:2016-07-08 12:49:03 【问题描述】:

在快速尝试中,我尝试将 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,这在调试模式下工作,但在发布模式下运行时会出现“未处理的异常/访问冲突”。

有人能解释一下,为什么以及如何正确存储数据吗?

【问题讨论】:

也许你的变量没有正确对齐? 而且即使你能做到这一点,它也没有任何意义。 @harold 我在完全围绕 SIMD 类型设计的例程中经常做这种事情(作为原始数组,而不是 std::vector)。 【参考方案1】:

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

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

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

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

【讨论】:

将 __m256i 存储为整数

】将__m256i存储为整数【英文标题】:Store__m256itointeger【发布时间】:2015-04-0814:30:54【问题描述】:如何将__m256i数据类型存储为整数?我知道花车有:_mm256_store_ps(float*a,__m256b)第一个参数是输出数组。对于我只找到的整数:_mm256_s... 查看详情

将 __m256i 设置为两个 __m128i 值的值

...值的值【英文标题】:Setting__m256itothevalueoftwo__m128ivalues【发布时间】:2015-09-1712:36:12【问题描述】:因此,AVX有一个来自immintrin.h的函数,它应该允许将两个__m128i值的串联存储到一个__m256i值中。功能是__m256i_mm256_set_m128i(__m128ihi,_... 查看详情

将 __m256i 设置为两个 __m128i 值的值

...值的值【英文标题】:Setting__m256itothevalueoftwo__m128ivalues【发布时间】:2015-09-1712:36:12【问题描述】:所以,AVX有一个来自immintrin.h的函数,它应该允许将两个__m128i值的串联存储到一个__m256i值中。功能是__m256i_mm256_set_m128i(__m128ihi,_... 查看详情

将 __m256d 转换为 __m256i

...将__m256d转换为__m256i【英文标题】:Convert__m256dto__m256i【发布时间】:2018-06-2416:17:27【问题描述】:既然这样投:__m256da;uint64_tt[4];_mm256_store_si256((__m256i*)t,(__m256i)a);/*Castof\'a\'to__m256inotallowed*/在VisualStudio下编译时不允许使用,我想... 查看详情

多维 __m256i 数据类型对齐问题

...题【英文标题】:Multidimensional__m256idatatypealignmentissues【发布时间】:2016-05-0513:19:01【问题描述】:我希望有人能够帮助解决这个困扰我一个多小时的问题。我有这段代码(在C中):#include<immintrin.h>voidtest_vectors(__m256istate[5][2... 查看详情

有符号 32 位元素的 AVX __m256i 整数除法

...法【英文标题】:AVX__m256iintegerdivisionforsigned32-bitelements【发布时间】:2019-02-2616:19:56【问题描述】:我正在尝试在AVX机器中进行SIMD划分并遇到编译错误。这是我的代码:__m256ihelp;intarr[8];intarr2[8];help=_mm256_load_si256((__m256i*)arr);__m 查看详情

加载指令与 AVX 中的 AVX2 __m256i const* mem_addr [关闭]

...文标题】:AVX2__m256iconst*mem_addrinloadinstructionsvsAVX[closed]【发布时间】:2016-03-0317:34:52【问题描述】:我无法像以前在AVX中那样使用AVX2内在指令加载或存储。没有错误,只有警告,并且它不会在运行时执行加载/存储指令。其他AVX2... 查看详情

SIMD __m256i 到 __m256d 转换结果

...__m256d转换结果【英文标题】:SIMD__m256ito__m256dcastresults【发布时间】:2019-02-2717:38:52【问题描述】:我正在尝试将SIMD整数变量转换为双精度。但是我看不到这个操作的结果是什么。示例:intarr[8]=12345678,12333333,12344444,12355555,12366666... 查看详情

将 16 位值的 __m256i 打包(饱和)到 8 位值的 __m128i?

...】:Pack(withsaturation)__m256iof16-bitvaluesto__m128iof8-bitvalues?【发布时间】:2021-04-2514:53:27【问题描述】:是否有AVX或AVX2操作可将16x16位无符号整数(uint16_t)值的__m256i转换为16x8位无符号整数(uint8_t)值的__m128i(采用饱和的低字 查看详情

矢量化:乘 _m256i 元素

...乘_m256i元素【英文标题】:vectorization:multiply_m256ielements【发布时间】:2018-01-2208:24:56【问题描述】:我希望使用SIMD指令一次将寄存器中的所有32位整数相乘,这是我迄今为止尝试过的:int32_ta[8]=1,2,3,4,5,6,7,8;int32_tb[8]=1,2,3,4,5,6,7,8;_... 查看详情

从四个 __m128i 变量的 64 个高位或低位初始化 __m256i

...标题】:Initialize__m256ifrom64highorlowbitsoffour__m128ivariables【发布时间】:2014-07-0608:26:37【问题描述】:假设我有四个__m128i变量,其中包含一些计算产生的数据。例如,让我们说:__m128ia=_mm_set_epi64x(1,11);__m128ib=_mm_set_epi64x 查看详情

将__m256i的前N位或后N位设置为1,其余为0的有效方法

...文标题】:EfficientwaytosetfirstNorlastNbitsof__m256ito1,therestto0【发布时间】:2017-09-0315:16:36【问题描述】:如何使用AVX2有效地设置为1第一个N位最后一个N位来自__m256i,将其余设置为0?这些是位范围的尾部和头部的2个独立操作,当范... 查看详情

如何将 __m256i 向量除以整数变量?

...量?【英文标题】:Howtodividea__m256ivectorbyanintegervariable?【发布时间】:2017-02-2415:26:23【问题描述】:我想将一个AVX2向量除以一个常数。我访问了thisquestion和许多其他页面。看到了一些可能对Fixed-pointarithmetic有帮助的东西,我不... 查看详情

将 __m128i 值转换为 std::tuple

...换为std::tuple【英文标题】:Convert__m128ivalueintostd::tuple【发布时间】:2017-05-1212:14:27【问题描述】:想象一下,经过一些SIMD计算,我得到一个__m128i值,其中第四个字段的值为零。是否有一种简单便携的方法可以将其他三个字段转... 查看详情

int64_t 指针转换为 AVX2 内在 _m256i

...内在_m256i【英文标题】:int64_tpointercasttoAVX2intrinsic_m256i【发布时间】:2016-07-1322:09:02【问题描述】:您好,我对AVX2内部函数有一个奇怪的问题。我创建了一个指向带有int64_t*强制转换的_m256i向量的指针。然后我通过取消引用指针... 查看详情

将 __m256i 寄存器转换为 uint64_t 位掩码,以便每个字节值处的值是输出中的设置位

...touint64_tbitmasksuchthatthatvalueateachbyte\'svalueisasetbitintheoutput【发布时间】:2020-09-0518:14:23【问题描述】:基本上我有一个__m256i变量,其中每个字节代表一个需要在uint64_t中设置的 查看详情

AVX2 的汇编错误

】AVX2的汇编错误【英文标题】:AssembleErrorforAVX2【发布时间】:2014-03-1012:55:57【问题描述】:我尝试用gcc(g++)编译一个AVX2程序。但它没有正常工作。#include<immintrin.h>....__m256i_vector256=_mm256_loadu_si256((__m256i*)pin);__m256i_vectorMask=_mm... 查看详情

在 4 个 __m256d 寄存器中找到 4 个最小值

...4个最小值【英文标题】:Find4minimalvaluesin4__m256dregisters【发布时间】:2016-03-1116:28:11【问题描述】:我不知道如何实现:__m256dmin(__m256dA,__m256dB,__m256dC,__m256dD)__m256dresult;//resultshouldcontain4minimalvaluesoutof16:A[0],A[1] 查看详情