Geo*_*rge 2 c x86 simd intrinsics avx2
如何将__m256i数据类型存储为整数?
我知道浮子有:
_mm256_store_ps(float *a, __m256 b)
Run Code Online (Sandbox Code Playgroud)
其中第一个参数是输出数组.
对于整数我只发现:
_mm256_store_si256(__m256i *a, __m256i b)
Run Code Online (Sandbox Code Playgroud)
其中两个参数都是__m256i数据类型.
做这样的事情就足够了:
int * X = (int*) _mm_malloc( N * sizeof (*X) ,32 );
Run Code Online (Sandbox Code Playgroud)
(我使用它作为函数的参数,我想获得它的值)
内功能:
__m256i * Xmmtype = (__m256i*) X;
//fill output
_mm256_store_si256( &Xmmtype[ i ] , T ); //T is __m256i
Run Code Online (Sandbox Code Playgroud)
这个可以吗?
- - -更新 - - - - - - - - - - - -
好的,如果我有:
__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 );
}
}
Run Code Online (Sandbox Code Playgroud)
你所做的就是OK,但你不需要创建一个临时指针 - 你可以直接应用演员,例如:
_mm256_store_si256( (__m256i *)X, T );
Run Code Online (Sandbox Code Playgroud)
要么:
_mm256_store_si256( (__m256i *)&X[i], T );
Run Code Online (Sandbox Code Playgroud)
看起来您的索引X方式不符合AVX对齐要求,即X[i]不保证32字节对齐,因此您应该使用未对齐的存储:
_mm256_storeu_si256( (__m256i *)&X[i], T );
Run Code Online (Sandbox Code Playgroud)