c - 从填充为 0 的数组加载到 256 位 AVX2 寄存器
问题描述
如果数组大小小于 4,我想将 4 个 double 加载到 256 位寄存器中并用 0 填充。
register __m256d c = _mm256_loadu_pd(C);
现在假设 C 中只有三个元素,我想将寄存器 c 中的最后一个“条目”填充为 0。我怎样才能有效地做到这一点?
解决方案
这是一种方法。与 不同_mm256_maskload_pd
的是,下面的函数不需要加载或创建掩码。
// Load 3 doubles from memory, zero out the 4-th one.
inline __m256d load3( const double* source )
{
const __m128d low = _mm_loadu_pd( source );
const __m128d high = _mm_load_sd( source + 2 );
return _mm256_set_m128d( high, low ); // vinsertf128
}
为了完整起见,这里有 2 个其他变体。
// Zero out the high 2 double lanes.
inline __m256d zeroupper( __m128d low2 )
{
const __m256d low = _mm256_castpd128_pd256( low2 ); // no instruction
const __m256d zero = _mm256_setzero_pd(); // vxorpd
// vblendpd is 4-5 times faster than vinsertf128
return _mm256_blend_pd( zero, low, 3 ); // vblendpd
}
// Load 2 doubles from memory, zero out other 2
inline __m256d load2( const double* source )
{
return zeroupper( _mm_loadu_pd( source ) );
}
// Load 1 double from memory, zero out the other 3
inline __m256d load1( const double* source )
{
return zeroupper( _mm_load_sd( source ) );
}
推荐阅读
- javascript - ContentEditable 没有更新虚拟 DOM
- docker - 微服务架构中 docker 容器之间的身份验证,绕过 JWT 身份验证进行内部调用
- android - 如何使用 Navigator 推送值并接收它们?
- xml - CameraX 和条码扫描仪 - 条码扫描仪无法读取
- scala - 无法将 java.util.List 转换为 Scala 列表
- xslt - 如何创建导致空节点序列的源
- javascript - 为什么 Angular 创建版本低于已安装版本的项目?
- xcode - Xcode 12 - 下载更多模拟器运行时为空
- python - 将 csv 文件读入字典
- flutter - 颤振包得到ERORR 66 linux:无法解压缩gz流接收数据时连接关闭,路径=''