c++ - 有没有一种方法可以有效地进行小的固定范围乘法?

标签 c++ c optimization

假设我有一个内联函数:

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.

Reference

您一次可以执行 4 次乘法运算。由于您知道您的数据范围是有限的,因此截断不会成为问题。您还可以使用单精度 float 和旧的 mulps 内在函数。

此外,使用 VTune 之类的分析器分析您的程序并查看您是否遇到过多的缓存未命中、别名或对齐问题可能是个好主意。

关于c++ - 有没有一种方法可以有效地进行小的固定范围乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113502/

相关文章:

c++ - 为什么在 C++ 中使用 cin、cout 或 %I64d 优于 %lld 说明符?

c - 将连接重定向到 C 中指定本地端口的服务器应用程序

c++ - C++代码的优化

ios - 不能使用可重复使用的电池。如何优化 tableView 中的平滑滚动?

python - mysql读取->处理->更新,针对大数据进行优化

c++ - << operator override 使用 g++ 而不是 Windows 编译

c++ - 不在调整大小的 vector 中使用迭代器

c++ - 在运行时定义 C++ 函数

c - HTTP 代理服务器保持事件连接支持

c - MISRA C :2012 Rule 14. 4