gpt4 book ai didi

c++ - 计算解释为 4 字节的两个整数之间的范数

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:06 25 4
gpt4 key购买 nike

我想写一个函数norm2来计算

uint32_t norm2(uint32_t a, uint32_t b) {
return sqd( a & 0x000000FF , b & 0x000000FF )
+ sqd((a & 0x0000FF00)>> 8, (b & 0x0000FF00)>> 8)
+ sqd((a & 0x00FF0000)>>16, (b & 0x00FF0000)>> 16)
+ sqd((a & 0xFF000000)>>24, (b & 0xFF000000)>> 24);
}
uint32_t sqd(uint32_t a, uint32_t b) {
uint32_t x = (a > b) ? a - b : b - a;
return x*x;
}

在 GCC 下最快的方法是什么?例如使用汇编程序、SSE 或类似程序。

最佳答案

使用 SSE 只需几条指令即可轻松完成所有操作:

#include <immintrin.h>
#include <stdint.h>

uint32_t norm2(uint32_t a, uint32_t b) {
const __m128i vec_zero = _mm_setzero_si128();
__m128i vec_a = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a), vec_zero);
__m128i vec_b = _mm_unpacklo_epi8(_mm_cvtsi32_si128(b), vec_zero);
__m128i vec_diff = _mm_sub_epi16(vec_a, vec_b);
__m128i vec_dsq = _mm_madd_epi16(vec_diff, vec_diff);
return _mm_cvtsi128_si32(_mm_hadd_epi32(vec_dsq, vec_dsq));
}

我们在这里做的是用零 vector “解包”a 和 b,以将各个字节扩展为 16 位整数 vector 。然后我们将它们相减(作为 16 位整数,避免溢出的风险),并将它们相乘并累加(作为 32 位整数,再次避免溢出的风险)。

我没有安装 GCC 进行测试,但上面的代码生成了接近最优的汇编;对于这样一个简单的任务,没有必要投入到装配中。

关于c++ - 计算解释为 4 字节的两个整数之间的范数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937950/

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