Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以有效地进行小范围的固定范围乘法?_C++_C_Optimization - Fatal编程技术网

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

C++ 有没有一种方法可以有效地进行小范围的固定范围乘法?,c++,c,optimization,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++编写的科学计算程序中提取出来的,分析表明,由于调用非常频繁,上述函数消耗了整个程序10%以上的CPU时间。因此,我想尝试找出一种加速的方法 谢谢:)英特尔的SSE4内部函

假设我有一个内联函数:

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++编写的科学计算程序中提取出来的,分析表明,由于调用非常频繁,上述函数消耗了整个程序10%以上的CPU时间。因此,我想尝试找出一种加速的方法


谢谢:)

英特尔的SSE4内部函数提供了数据类型
\uuuM128i
,它可以保存4个32位值

\uuuum128i\umm\umullo\uepi32(\uuuum128i a,\uuuuum128i b)

压缩整数32位乘法,结果上半部分截断

一次可以执行4次乘法。因为您知道您的数据范围是有限的,所以截断不会是一个问题。您还可以使用单精度浮点和较旧的
mulps
内部变量


此外,最好使用VTune之类的分析器分析程序,看看是否存在过多的缓存未命中、混叠或对齐问题。

乘法很可能会被编译为一条CPU指令。因此,不可能进行进一步的优化。也许可以减少对此函数的调用数量,而不是降低调用本身的成本?查看生成的程序集会有所帮助,并且您可以确保对函数的所有调用都真正内联,
inline
不能保证这一点。更改为:
inline int mul(int x,int y){return x*y;}
也会有所帮助。我认为我们用显微镜看得太多了。如果我们缩小一点,你可能会发现有机会对算法进行矢量化,改进引用的局部性,等等。仅仅盯着一个简单的函数,它几乎肯定会内联,乘以两个整数,这会使优化变得非常困难——信息太少。