3

如何将 __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 );


    } 

} 
4

1 回答 1

5

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

_mm256_store_si256( (__m256i *)X, T );

或者:

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


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

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

_mm256_storeu_si256( (__m256i *)&X[i], T );
于 2015-04-08T14:34:07.160 回答