使用 int32_t 而不是双精度运行矢量点积是否更快?



我读过一些帖子(例如,C++内置类型(,说对于现代英特尔至强CPU,使用int32_t和使用双精度之间没有区别。

但是,我注意到当我进行向量乘法时,

std::vector<T> a, b, c;
// run some initialization
for( std::size_t i = 0; i < 1000000; ++i){
c[i] = a[i] * b[i];
}  

如果我将 T 设置为 int32_t,这段代码的运行速度比将 T 设置为 Double 要快得多。

我在至强E5620 + centOS上运行这个

谁能在这里澄清一下?使用int32_t是否更快?

您正在运行一百万次乘法,使用 200 万个输入和 100 万个输出。使用 4 个字节值,即 12 MB。使用 8 个字节值,即 24MB。E5620 具有 12 MB 缓存。

这是我的 CPU 的结果;

英特尔® 酷睿™ i5-8250U CPU @ 1.60GHz gcc 7.3

纯 GCC,无需优化

short add/sub: 1.586071 [0]
short mul/div: 5.601069 [1]
long add/sub: 1.659803 [0]    
long mul/div: 8.145207 [0] 
long long add/sub: 1.826622 [0]    
long long mul/div: 8.161891 [0]  
float add/sub: 2.685403 [0]    
float mul/div: 3.758135 [0]
double add/sub: 2.662717 [0]
double mul/div: 4.189572 [0]

含 GCC -O3

short add/sub: 0.000001 [0]
short mul/div: 4.491903 [1]
long add/sub: 0.000000 [0]
long mul/div: 6.535028 [0]
long long add/sub: 0.000000 [0]
long long mul/div: 6.543064 [0]
float add/sub: 1.182737 [0]
float mul/div: 2.218142 [0]
double add/sub: 1.183991 [0]
double mul/div: 2.529001 [0]

结果实际上取决于您的架构和优化。我记得,20年前,在我的大学里有一个IBM Sparc工作站,它的浮动性能比整数更好。

请阅读这个精彩的演讲;

最新更新