将 __m256i 存储为整数

Posted

技术标签:

【中文标题】将 __m256i 存储为整数【英文标题】:Store __m256i to integer 【发布时间】:2015-04-08 14:30:54 【问题描述】:

如何将 __m256i 数据类型存储为整数?

我知道花车有:

_mm256_store_ps(float *a, __m256 b)

第一个参数是输出数组。

对于我只找到的整数:

_mm256_store_si256(__m256i *a, __m256i b)

其中两个参数都是 __m256i 数据类型。

做这样的事情就够了吗:

int * X = (int*) _mm_malloc( N * sizeof (*X) ,32 );

(我将它用作函数的参数,我想获取它的值)

内部函数:

__m256i * Xmmtype = (__m256i*) X;

//fill output
_mm256_store_si256( &Xmmtype[ i ] , T ); //T is __m256i

这样好吗?

-----已更新 -----------

好的,如果我有:

__m256i T;

for ( y = 0; y < h; y++ )
 
    for ( x = 0; x < w; x++ )
    
        for ( int i = 0; i < N; i+=8 )
        
            //calculate here the  T

         

        //write result
        _mm256_store_si256( &Xmmtype[ x + y * w ] , T );


     

 

【问题讨论】:

【参考方案1】:

你所做的没问题,但你不需要创建一个临时指针 - 你可以直接应用强制转换,例如:

_mm256_store_si256( (__m256i *)X, T );

或:

_mm256_store_si256( (__m256i *)&X[i], T );


根据您的问题的最新编辑进行更新:

看起来您正在以不符合 AVX 对齐要求的方式索引 X,即不保证 X[i] 是 32 字节对齐的,因此您应该使用未对齐的存储:

_mm256_storeu_si256( (__m256i *)&X[i], T );

【讨论】:

:你好,它给了我应用强制转换的分段错误。 这可能是一个不同的问题——你需要确保X(或&amp;X[i])是32字节对齐的,或者如果你不能保证使用_mm256_storeu_si256而不是_mm256_store_si256对齐。 我使用了 _mm_malloc( N * sizeof (*X) ,32 )。它是 32 对齐的,对吗?我也会尝试 storeu 并让你知道。(我将能够测试它不过下周) 如果您使用的是X[i],那么i 需要是8 的倍数才能保持对齐。

以上是关于将 __m256i 存储为整数的主要内容,如果未能解决你的问题,请参考以下文章

将 __m256i 设置为两个 __m128i 值的值

将 __m256i 设置为两个 __m128i 值的值

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

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

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

矢量化:乘 _m256i 元素