gpt4 book ai didi

x86 - SSE:_mm_load/store与使用直接指针访问之间的区别

转载 作者:行者123 更新时间:2023-12-03 14:52:32 26 4
gpt4 key购买 nike

假设我要添加两个缓冲区并存储结果。两个缓冲区均已分配16字节对齐。我发现了两个例子。

第一个是使用_mm_load将缓冲区中的数据读取到SSE寄存器中,执行加法运算并将其存储回结果寄存器。到现在为止,我会那样做。

void _add( uint16_t * dst, uint16_t const * src, size_t n )
{
for( uint16_t const * end( dst + n ); dst != end; dst+=8, src+=8 )
{
__m128i _s = _mm_load_si128( (__m128i*) src );
__m128i _d = _mm_load_si128( (__m128i*) dst );

_d = _mm_add_epi16( _d, _s );

_mm_store_si128( (__m128i*) dst, _d );
}
}


第二个示例只是直接对内存地址执行添加操作,而无需进行加载/存储操作。两种接缝都能正常工作。

void _add( uint16_t * dst, uint16_t const * src, size_t n )
{
for( uint16_t const * end( dst + n ); dst != end; dst+=8, src+=8 )
{
*(__m128i*) dst = _mm_add_epi16( *(__m128i*) dst, *(__m128i*) src );
}
}


因此,问题是第二个示例是否正确或可能有任何副作用,何时使用加载/存储是强制性的。

谢谢。

最佳答案

两种版本都很好-如果查看生成的代码,您会看到第二种版本仍然会向向量寄存器至少产生一次加载,因为PADDW(aka _mm_add_epi16)只能直接从内存中获取其第二种参数。

实际上,大多数非平凡的SIMD代码在加载和存储数据之间所做的操作要比一次添加操作多得多,因此,通常,您可能希望最初使用_mm_load_XXX将数据加载到矢量变量(寄存器)中,执行所有SIMD对寄存器进行操作,然后通过_mm_store_XXX将结果存储回内存。

关于x86 - SSE:_mm_load/store与使用直接指针访问之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11034302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com