AVX1无AVX2环境下m256向量水平最大值计算及归一化实现
AVX1环境下__m256向量最大值计算实现(无AVX2支持)
我自己摸索出了针对AVX1(无AVX2)环境下计算8浮点数__m256向量最大值的方案,没找到同类公开答案,特意分享给有需要的开发者。
以下是具体实现,最终_max会被填充为输入向量x的最大值,可直接用于归一化等场景:
__m256 _inv2_max; // 计算向量x的最大值并广播到整个向量 __m256 _inv = _mm256_permute_ps(x, 0b00011011); __m256 _max = _mm256_max_ps(x, _inv); _inv2_max = _mm256_permute_ps(_max, 0b000000010); _max = _mm256_max_ps(_inv2_max, _max); __m128 vlow = _mm256_castps256_ps128(_max); __m128 vhigh = _mm256_extractf128_ps(_max, 1); __m128 a[1] = {_mm_permute_ps(_mm_max_ps(vlow, vhigh), 0b00000000)}; _max = _mm256_broadcast_ps(a);
注:_mm_max_ps(vlow, vhigh)计算后,最大值已位于结果向量的索引0位置,本实现将该最大值广播至_max的所有元素位置。
内容的提问来源于stack exchange,提问作者Vadim Kashtanov
相关产品推荐
相关产品推荐

