Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
Performance 存在NaN值时的Matlab关系运算符性能_Performance_Matlab_Comparison_Nan - Fatal编程技术网

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

Performance 存在NaN值时的Matlab关系运算符性能,performance,matlab,comparison,nan,Performance,Matlab,Comparison,Nan,测试以下代码时(注意第二个片段中的*NaN) 关于Matlab的修订 R2012a64位 R2013a32位 我观察到以下奇怪的行为 R2012a64位 R2013a32位 因此,在R2013a 32位的情况下,NaN值的存在大大增加了运行时间。有人能告诉我这可能是从哪里来的吗 致以最良好的祝愿, Thomas问题可能是由于您的32位系统在x=0(15000000)*NaN中重新分配~40MB内存所需的时间较长行。可能没有足够的可用RAM,需要将内存交换到磁盘。要检查哪个部分(分配或比较)有问题

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

关于Matlab的修订

  • R2012a64位
  • R2013a32位
  • 我观察到以下奇怪的行为

    R2012a64位

    R2013a32位

    因此,在R2013a 32位的情况下,NaN值的存在大大增加了运行时间。有人能告诉我这可能是从哪里来的吗

    致以最良好的祝愿,
    Thomas

    问题可能是由于您的32位系统在
    x=0(15000000)*NaN中重新分配~40MB内存所需的时间较长行。可能没有足够的可用RAM,需要将内存交换到磁盘。要检查哪个部分(分配或比较)有问题,请分别对这些部分进行检查


    顺便说一句,不需要乘以NaN-你只需做
    x=NaN(15000000)

    您使用的是英特尔CPU,其中,对于32位代码,您使用的是它的FPU。对于NaN、Inf和非规范化以及。好消息是,SSE单元仅在非规范化情况下运行缓慢,并且以全速处理NAN,所以如果您能说服编译器发出SSE代码,您应该能够全速运行。对于x64,这是自动完成的,因为这意味着SSE2和ABI使用SSE寄存器,但由于x32浮点ABI使用FPU寄存器,FPU用于进行计算,以避免移动过多

    我没有深入挖掘(我们使用嵌入式平台,但目前并非所有平台都有SSE),但我怀疑更改一些编译器/标志会有所帮助。如果是这样的话,检查事物是如何内联的,以便查看在每次函数调用中是否有SSE到FPU和返回。如果代码中某个地方有一个小的紧密循环,那么就有可能使用SSE


    upd:Oops刚刚注意到这是matlab。推理仍然存在,但对于解决方案,您必须自己考虑。

    注意,2013a 64位的行为与2012a类似,因此这不是版本之间的回归。感谢测试@MattB。-所以这就是架构。顺便说一句:在我的测试中,两个Windows 7都忘了说。责怪通常的嫌疑犯(JIT编译器)?为了获得更多细节,你可以分别对分配(
    x=zero(15000000)
    )、NaN的乘法和
    *
    进行tic/toc,看看它到底在哪里花费你的时间。我怀疑这不是JIT编译器,但是BLAS或LAPACK版本。我记得当MATLAB使用ATLAS而不是Intel库时,NaN处理是一个问题。不同版本的英特尔MKL可能会以不同的方式处理此问题。
    version('-blas')
    version('-lapack')
    在每个平台上说了什么?Sry我不再有确切的数字了,但从计时中去掉分配并不会显著改变结果。
    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
    
    Elapsed time is 0.056266 seconds.
    Elapsed time is 0.059677 seconds.
    
    Elapsed time is 0.070116 seconds.
    Elapsed time is 3.995697 seconds.