# New Ticket Created by Michal Jurosz # Please include the string: [perl #39801] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=39801 >
Implement spectralnorm shootout benchmark ( http://shootout.alioth.debian.org/sandbox/benchmark.php?test=all&lang=parrot ). -- S pozdravem Michal Jurosz
Index: examples/shootout/spectralnorm.pir =================================================================== --- examples/shootout/spectralnorm.pir (revision 0) +++ examples/shootout/spectralnorm.pir (revision 0) @@ -0,0 +1,161 @@ +#!./parrot -j +# +# spectralnorm.pir N (N = 100 for shootout) +# by Michal Jurosz + +.sub eval_A + .param int i + .param int j + + # return 1.0/((i+j)*(i+j+1)/2+i+1); + $N0 = i + j + $N1 = $N0 + 1 + $N0 *= $N1 + $N0 /= 2 + $N0 += i + $N0 += 1 + $N0 = 1 / $N0 + .return ($N0) +.end + + +.sub eval_A_times_u + .param int N + .param pmc u + .param pmc Au + + .local int i, j + + i = 0 +beginfor_i: + unless i < N goto endfor_i + Au[i] = 0 + j = 0 + beginfor_j: + unless j < N goto endfor_j + # Au[i]+=eval_A(i,j)*u[j] + $N0 = eval_A(i,j) + $N1 = u[j] + $N0 *= $N1 + $N1 = Au[i] + $N0 += $N1 + Au[i] = $N0 + + inc j + goto beginfor_j + endfor_j: + + inc i + goto beginfor_i +endfor_i: +.end + + +.sub eval_At_times_u + .param int N + .param pmc u + .param pmc Au + + .local int i, j + + i = 0 +beginfor_i: + unless i < N goto endfor_i + Au[i] = 0 + j = 0 + beginfor_j: + unless j < N goto endfor_j + # Au[i]+=eval_A(j,i)*u[j] + $N0 = eval_A(j,i) + $N1 = u[j] + $N0 *= $N1 + $N1 = Au[i] + $N0 += $N1 + Au[i] = $N0 + + inc j + goto beginfor_j + endfor_j: + + inc i + goto beginfor_i +endfor_i: +.end + + +.sub eval_AtA_times_u + .param int N + .param pmc u + .param pmc AtAu + + .local pmc v + v = new .FixedFloatArray + v = N + + eval_A_times_u(N,u,v) + eval_At_times_u(N,v,AtAu) +.end + + +.sub main :main + .param pmc argv + $S0 = argv[1] + .local int N + N = $S0 + + .local pmc u, v + u = new .FixedFloatArray + u = N + v = new .FixedFloatArray + v = N + + .local int i + + i = 0 +beginfor_init: + unless i < N goto endfor_init + u[i] = 1 + inc i + goto beginfor_init +endfor_init: + + + i = 0 +beginfor_eval: + unless i < 10 goto endfor_eval + eval_AtA_times_u(N,u,v) + eval_AtA_times_u(N,v,u) + inc i + goto beginfor_eval +endfor_eval: + + .local float vBv, vv + vBv = 0.0 + vv = 0.0 + + i = 0 +beginfor_calc: + unless i < N goto endfor_calc + # vBv+=u[i]*v[i]; vv+=v[i]*v[i]; + $N0 = u[i] + $N1 = v[i] + $N0 *= $N1 + vBv += $N0 + $N0 = $N1 + $N0 *= $N0 + vv += $N0 + inc i + goto beginfor_calc +endfor_calc: + + # print "%0.9f" % (sqrt(vBv/vv)) + $N0 = vBv / vv + $N0 = sqrt $N0 + .local pmc spf + spf = new .FixedFloatArray + spf = 1 + spf[0] = $N0 + $S0 = sprintf "%.9f\n", spf + print $S0 + exit 0 +.end