假设我有一个内联函数:
inline int mul(short x, short y) {
return (int)x * (int)y;
}
这里y在{1,2,...,32}中,x在{-4,-3,-2,-1, 0,1,...,8192}。考虑到 y 在一个非常小的范围内,是否存在加速 mul() 的方法?
背景:这段代码是从一个用C/C++编写的科学计算程序中提取出来的,经过profiling发现,由于上述函数调用非常频繁,占用了整个程序10%以上的CPU时间。因此,我想想办法加快速度。
谢谢你:)
最佳答案
Intel 的 SSE4 内在函数提供数据类型 __m128i
,它可以容纳 4 个 32 位值。
__m128i _mm_mullo_epi32(__m128i a, __m128i b)
Packed integer 32-bit multiplication with truncation of upper halves of results.
您一次可以执行 4 次乘法运算。由于您知道您的数据范围是有限的,因此截断不会成为问题。您还可以使用单精度 float 和旧的 mulps
内在函数。
此外,使用 VTune 之类的分析器分析您的程序并查看您是否遇到过多的缓存未命中、别名或对齐问题可能是个好主意。
关于c++ - 有没有一种方法可以有效地进行小的固定范围乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113502/