这个MIPS程序应该花这么长时间吗? (近似于pi的程序)

问题描述 投票:0回答:1

Part 2 of this

其目的是编写使用该算法的MIPS程序。是的它有效,仅花费约30分钟即可完成delta = 1E-2。C程序(与gcc一起编译)花费大约1分半钟。我已经在C程序中尝试过delta = 1E-3,但是在2个多小时后不得不中止它。

我只想知道:这应该发生吗?结果对我来说看起来足够准确(3.13909200,增量= 1E-2)。我做错什么了吗?

我知道此算法可能不是最有效的,也不是MIPS或MARS(我用于MIPS)。

MIPS代码:

    .data

l_cubo:     .double     1.0
delta:      .double     1E-2
zero:       .double     0.0
dois:       .double     2.0
six:        .double     6.0


    .text
    .globl main

main:
    la  $a0,l_cubo
    l.d $f20,0($a0) #l_cubo
    la  $a0,dois

    l.d $f4,0($a0)
    div.d   $f22,$f20,$f4   #r_esfera
    la  $a0,delta
    l.d $f24,0($a0) #delta
    la  $a0,zero
    l.d     $f26,0($a0)     #v_cubo ou v_total
    l.d $f28,0($a0)     #v_esfera

    l.d $f4,0($a0)      #x
    l.d $f6,0($a0)      #y
    l.d $f8,0($a0)      #z

loop_x:

    c.lt.d  $f4,$f20
    bc1f    end_loop_x
    l.d $f6,0($a0)
    loop_y:

        c.lt.d  $f6,$f20
        bc1f    end_loop_y
        l.d $f8,0($a0)
        loop_z:

            c.lt.d  $f8,$f20
            bc1f    end_loop_z
            add.d   $f26,$f26,$f24
            mov.d   $f12,$f4
            mov.d   $f14,$f6
            mov.d   $f30,$f8

            jal in_esfera


            l.d $f10,0($a0)

            beqz    $v0,continue

                add.d   $f28,$f28,$f24
            continue:
                add.d   $f8,$f8,$f24
                j loop_z
            end_loop_z:
        add.d   $f6,$f6,$f24
        j loop_y
        end_loop_y:
        add.d   $f4,$f4,$f24
        j loop_x
end_loop_x:

mul.d   $f24,$f24,$f24
mul.d   $f28,$f28,$f24
mul.d   $f26,$f26,$f24

div.d   $f28,$f28,$f26

la  $a0,six
l.d $f10,0($a0)
mul.d   $f28,$f28,$f10

li  $v0,3       #
mov.d   $f12,$f28   #
syscall         # print pi

li $v0,10       #
syscall         #exit

####################################

    .text
    .globl  in_esfera

in_esfera:

    sub.d   $f12,$f12,$f22
    mul.d   $f12,$f12,$f12
    sub.d   $f14,$f14,$f22
    mul.d   $f14,$f14,$f14
    sub.d   $f30,$f30,$f22
    mul.d   $f30,$f30,$f30
    add.d   $f30,$f12,$f30
    add.d   $f30,$f14,$f30

    mul.d   $f16,$f22,$f22

    li $v0,0
    c.le.d  $f30,$f16
    bc1f    continue2
        li $v0,1
    continue2:
        jr  $ra

我只是想知道我的教授如何纠正需要30分钟才能执行的程序。

c optimization mips pi approximation
1个回答
0
投票

我假设它使用与C版本相同的算法。通过测试立方体中的点的3D网格以查看它们是否在球体内,可以近似得出Pi的值。这是一种O(N^3)计算,其中N是网格每个维度中的单位(增量)数。

所以...是的...您的MIPS代码可能需要很长时间才能计算出Pi的精确近似值。

  • 如果l_cubo为4,且增量为1/100,则您应该执行400 x 400 x 400 = 64,000,000次迭代。 30分钟似乎太过分了。

  • 如果l_cubo为4,且增量为1/1000,则您应该执行4000 x 4000 x 4000 = 64,000,000,000次迭代。

但是,如果您想对其进行全面检查,则MIP代码应该与具有相同参数的相同硬件上运行的C实现一样快,甚至不快于C实现。 (这很难检查您是否在MIPS模拟器上运行。)

© www.soinside.com 2019 - 2024. All rights reserved.