2013-04-22 85 views
7

我使用Matlab的profile分析了以下程序。 double和uint64都是64位变量。为什么比较两个double要比比较两个uint64快得多?它们都不是按比例对比的吗?为什么比uint64快两倍?

big = 1000000; 

a = uint64(randi(100,big,1)); 
b = uint64(randi(100,big,1)); 
c = uint64(zeros(big,1)); 
tic; 
for i=1:big 
    if a(i) == b(i) 
     c(i) = c(i) + 1; 
    end 
end 
toc; 

a = randi(100,big,1); 
b = randi(100,big,1); 
c = zeros(big,1); 
tic; 
for i=1:big 
    if a(i) == b(i) 
     c(i) = c(i) + 1; 
    end 
end 
toc; 

这是曲线的测量:

profile screenshot

这是tictoc措施:

Elapsed time is 6.259040 seconds. 
Elapsed time is 0.015387 seconds. 

效果消失时uint8..uint32或int8..int32是而不是64位数据类型。

+0

我不知道Matlab的,但比较,看它们是否彼此的距离小量内频繁一倍。这使得比较更加繁琐。 – 2013-04-22 23:04:49

+0

@EricJ。恐怕不是这种情况。这个问题也有点困惑。 – jazzbassrob 2013-04-22 23:05:55

+1

从你的结果看来,比较双打比uint64快得多 – Jonas 2013-04-22 23:09:07

回答

6

这也许是Matlab的解释,不支持64位int类型以及其他潜在的CPU的组合。

Matlab的有利于doubleint操作。大多数值都存储在double类型中,即使它们表示整数值。该doubleint==操作将采取不同的代码路径,以及MathWorks公司将会把时间用在调整了很多更多的关注和优化代码double比整数,特别是int64。事实上,老版本的Matlab完全不支持算术运算。 (和IIRC,它仍然不支持混合整数数学)。当你做int64数学,你使用不太成熟,少调代码,同样可以适用于==。在Matlab中,Int类型不是优先级。 int64的存在甚至可能会干扰优化该代码的JIT,但这只是一种猜测。

但有可能是一个底层硬件原因了。这里有一个假设:如果你在32位x86上,那么你正在使用32位通用(整数)寄存器。这意味着较小的整数类型可以放入一个寄存器,并使用快速指令进行比较,但64位整型值不适合寄存器,可能需要更多昂贵的指令序列进行比较。 double即使是64位宽,也可以装入x87浮点单元的宽浮点寄存器中,并且可以使用快速浮点比较指令在硬件中进行比较。这意味着[u]int64是唯一不能使用快速单寄存器,单指令操作进行比较的。

如果是这种情况,如果您在64位x86-64(64位Matlab)上运行相同的代码,则差异可能会消失,因为您随后具有64位宽的通用寄存器。但是,如果Matlab解释器的代码没有被编译来利用它,它可能不会。

+1

+1,看起来这里的硬件主要是错误的。我在R2010上测试了一个APU(它具有快速双精度算术,但可怕的整数数学),并且这个问题对于'single'和'(u)int8,16,33'是一样的。然后我测试了64位CPU,64位R2012 Matlab(它有64位宽的通用寄存器),所有问题都消失了。 – 2013-04-23 08:16:08

+0

@RodyOldenhuis:哦,告诉我们关于你正在运行的这个APU的更多信息。这听起来很有趣,对我来说是新的。 – 2013-04-24 20:09:37

+1

请参阅[此列表](http://en.wikipedia.org/wiki/List_of_AMD_Accelerated_Processing_Unit_microprocessors);我有一台AMD A6-3650,主要得益于我们的IT经理的迷恋;)但是,迄今为止,这对我来说并不是很好;有很多奇怪的副作用(就像我之前提到的那样)。对于我正在做/设计的高性能科学计算/模拟,我现在更喜欢CPU + GPU)。当然,我的APU相当新颖,并不是那里最好的,所以我希望这将在未来改变(因为我确信他们有很大的潜力) – 2013-04-25 05:39:20

相关问题