C 将m256i存储为整数

C 将m256i存储为整数,c,x86,simd,intrinsics,avx2,C,X86,Simd,Intrinsics,Avx2,如何将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 * X

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


    } 

} 
\uuuu m256i T;
对于(y=0;y
您所做的是可以的,但不需要创建临时指针-您可以直接应用强制转换,例如:

_mm256_store_si256( (__m256i *)X, T );
或:


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

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

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

:您好,应用强制转换时会出现分段错误。这可能是另一个问题-如果无法保证对齐,您需要确保
X
(或
&X[i]
)是32字节对齐的,或者使用
\u mm256\u storeu si256
而不是
\u mm256\u store\u si256
。我使用了\u mm\u malloc(N*sizeof(*X),32)。它是32对齐的,对吗?我也会尝试storeu并让您知道。(不过我下周可以测试它)如果您使用的是
X[I]
,那么
I
需要是8的倍数才能保持对齐。
_mm256_storeu_si256( (__m256i *)&X[i], T );