存在NaN值时的Matlab关系运算符性能

时间:2013-09-26 19:19:35

标签: performance matlab comparison nan

测试以下代码时(注意第二个片段中的* NaN)

tic
x = zeros(1,5000000);
for i=1:10
        selector = x > 1;
end
toc

tic
x = zeros(1,5000000)*NaN;
for i=1:10
        selector = x > 1;
end
toc

关于Matlab修订

  1. R2012a 64位
  2. R2013a 32位
  3. 我观察到以下奇怪的行为

    R2012a 64位

    Elapsed time is 0.056266 seconds.
    Elapsed time is 0.059677 seconds.
    

    R2013a 32位

    Elapsed time is 0.070116 seconds.
    Elapsed time is 3.995697 seconds.
    

    因此,在R2013a 32位的情况下,NaN值的存在会大大增加运行时间。任何人都可以给我一个暗示这可能来自哪里?

    祝你好运, 托马斯

2 个答案:

答案 0 :(得分:2)

您正在使用Intel CPU,对于32位代码,您正在使用它的FPU。 NaN,Inf和denormals以及this is an old story非常缓慢。好消息SSE单元只有非正常的慢速并且全速处理NaN,所以如果你能说服你的编译器发出SSE代码,那么你应该全速运行。这是针对x64自动完成的,因为它意味着SSE2而ABI使用SSE寄存器,但由于x32浮点ABI使用FPU寄存器,因此FPU用于进行计算以避免过多地移动物体。

我没有深入挖掘(我们使用的是嵌入式平台,并不是所有的都有SSE),但我怀疑更改一些编译器/标志应该有所帮助。如果是这样,检查内联的内容将是为了查看每个函数调用上是否有SSE-to-FPU-back。如果它是代码中的某个小环路,则可以使用SSE intrinsics

upd:哎呀刚刚注意到这是matlab。推理仍然存在,但对于解决方案,你必须看看自己。

答案 1 :(得分:0)

问题可能是由于您的32位系统需要更长的时间来重新分配x = zeros(1,5000000)*NaN;行中约40MB的内存。也许没有足够的可用内存,它需要将内存交换到磁盘。要检查哪个部分(分配或比较)有问题,请分别对这些部分进行分类。

顺便说一下,没有必要乘以NaN - 你可以简单地做x = nan(1,5000000);