Salsa
An Automatic Tool to Improve the Numerical Accuracy of Programs
Nasrine Damouche & Matthieu Martel
University of Perpignan, LAMPS Laboratory Metalibm Workshop 2018 March 12, 2018
- N. DAMOUCHE
MetaLibm Workshop 1 / 61
Salsa An Automatic Tool to Improve the Numerical Accuracy of - - PowerPoint PPT Presentation
Salsa An Automatic Tool to Improve the Numerical Accuracy of Programs Nasrine Damouche & Matthieu Martel University of Perpignan, LAMPS Laboratory Metalibm Workshop 2018 March 12, 2018 N. DAMOUCHE MetaLibm Workshop 1 / 61 SALSA Context
University of Perpignan, LAMPS Laboratory Metalibm Workshop 2018 March 12, 2018
MetaLibm Workshop 1 / 61
SALSA Context
MetaLibm Workshop 2 / 61
SALSA Context
MetaLibm Workshop 3 / 61
SALSA Context
MetaLibm Workshop 4 / 61
SALSA Context
= a + (b − b)
= 1.0 + (100.020 − 100.020) 1.0 = 1.0
a + (b − b)
1.0 + (100.020 − 100.020) 0.0
1.0
MetaLibm Workshop 5 / 61
SALSA Context
Original program a = 1.0; b = 10.0−21; c = (a + b) + b; What we can do with SARDANA [SAS’12] /HERBIE [PLDI’15]? a = 1.0; b = 10.0−21; a = 1.0; b = 10.0−21; c = (a + b) + b; c = a + (b + b); What we cannot do with SARDANA [SAS’12] /HERBIE [PLDI’15]?
MetaLibm Workshop 6 / 61
SALSA Context
θ(t + 1) = θ(t) + ∆θ(t) ∆d(t) = ∆dr(t) + ∆dl(t)
2
∆θ(t) = ∆dr(t) − ∆dl(t)
L
∆dl(t) = sl(t) × C ∆dr(t) = sr(t) × C
x(t + 1) = x(t) + ∆d(t + 1) × cos
2
2
L Sl y x Sr Trajectory
MetaLibm Workshop 7 / 61
SALSA Context
sl = [0.52, 0.53] double main(){ x = 0.0; y = 0.0; arg = 0.0; deltad = 0.0; deltadl = 0.0; deltadr = 0.0; deltatheta = 0.0; sr = 0.62831853071; t = 0.0; x = 0.0; y = 0.0; invl = 0.1; c = 12.34; theta = −0.985; while(t < 1.0){ deltadl = c ∗ sl; deltadr = c ∗ sr; deltad = (deltadl + deltadr) ∗ 0.5; deltatheta = (deltadr − deltadl) ∗ invl; arg = theta + (deltatheta ∗ 0.5); z = cosi(arg); x = x + (deltad ∗ z); q = sini(arg); y = y + (deltad ∗ q); theta = theta + deltatheta; t = t + 0.1;
}
return y;
}
double sini(double u){ w = u − ((u ∗ u ∗ u) ∗ 0.1666) + ((u ∗ u ∗ u ∗ u ∗ u) ∗ 0.0083); return w;
}
double cosi(double a){ b = 1.0 − (a ∗ a ∗ 0.5) + ((a ∗ a ∗ a ∗ a) ∗ 0.0416); return b;
}
ϴ L Sl y x Sr Trajectory
MetaLibm Workshop 8 / 61
SALSA Context
sl = [0.52, 0.53, −0., 0.] double main(){ t = 0.0; theta = −0.985; y = 0.0; x = 0.0; arg = 0.0; deltatheta = 0.0; deltad = 0.0; deltadr = 0.0; deltadl = 0.0; while(t < 1.0){ deltadl = (12.34 ∗ sl); deltadr = 7.753450668961402; deltad = (0.5 ∗ (deltadl + deltad r)); deltatheta = (0.1 ∗ (deltadr − deltad l)); arg = (theta + (deltatheta ∗ 0.5)); z = cosiTMP2(theta, deltatheta); x = (x + (deltad ∗ z)); q = siniTMP6(theta, deltatheta); y = (y + (deltad ∗ q)); theta = (theta + deltatheta); t = (t + 0.1);
};
return y;
}
double siniTMP6(doubletheta, doubledeltatheta){ TMP3 = (theta + (deltatheta ∗ 0.5)); w = ((TMP3 − (((TMP3 ∗ TMP3) ∗ TMP3) ∗ 0.1666)) + (((((TMP3 ∗ TMP3) ∗ TMP3) ∗ TMP3) ∗ TMP3) ∗ 0.0083)); return w;
}
double cosiTMP2(doubletheta, doubledeltatheta){ TMP1 = (theta + (deltatheta ∗ 0.5)); b = ((1.0 − ((TMP1 ∗ TMP1) ∗ 0.5)) + ((((TMP1 ∗ TMP1) ∗ TMP1) ∗ TMP1) ∗ 0.0416)); return b;
}
MetaLibm Workshop 9 / 61
SALSA Context
It Original Transformed
1
8.681698 8.444116
2
17.038230 16.589474
3
24.756744 24.147995
4
31.549016 30.852965
5
37.163761 36.469708
6
41.398951 40.806275
7
44.114126 43.724118
8
45.242707 45.148775
Original Odometry Transformed Odometry
MetaLibm Workshop 10 / 61
SALSA Floating-point arithmetics
MetaLibm Workshop 11 / 61
SALSA Floating-point arithmetics
1 3 = 0.33333333333333333333333333333333333.....
MetaLibm Workshop 12 / 61
SALSA Floating-point arithmetics
mantissa sign exponent 1
1 1 1 1 1 1 1 1 1
s : sign {+, -} e : exponent (8 or 11 bits) m : mantissa (23 or 52 bits)
Type Mantissa (bits) emax emin Exponent (bits) Single 23+1 +127
8 Double 52+1 +1023
11
MetaLibm Workshop 13 / 61
SALSA Floating-point arithmetics
+infinity To nearest Toward -infinity Toward zero Toward +infinity To nearest Toward +infinity Toward zero Toward -infinity +1/3
MetaLibm Workshop 14 / 61
SALSA Floating-point arithmetics
3 with p = 10 in b = 2
1.0101010101
Rounding function :
Round-off error : ↓∼(1/3) = 0.0000000000 . . . 0101
MetaLibm Workshop 15 / 61
SALSA Floating-point arithmetics
+
=
+
=
+
+
=
Global error
MetaLibm Workshop 16 / 61
SALSA Floating-point arithmetics
=
x1 × µ2
+ [0.0589882, 0.05919408] x2 × µ1 +
=
x1 × µ2 + [0.0589882, 0.05919408] x2 × µ1 +
+
=
Global error
MetaLibm Workshop 17 / 61
SALSA Related work
1
Transformation of Expressions
2
Intraprocedural Transformation
3
Interprocedural Transformation
MetaLibm Workshop 18 / 61
SALSA Related work
APEG (Abstract Program Expression Graph)
(a + a + b) × c (a + b + a) × c (b + a + a) × c c × (a + a + b) c × (a + b + a) c × (b + a + a) ((a + a) × c) + ( b × c) (((2 × a) + b ) × c) ((2 × a) × c) + (b × c) (c × b) + (c × (a + a)) (a × c) + (a × c) + (b × c) ((a + b) × c ) + (a × c)
. . .
2 a × + b □ +(a,a,b) × c × + c b c × a a + × × +
APEG for e = ((a + a) + b) × c.
MetaLibm Workshop 19 / 61
SALSA Related work
APEG (Abstract Program Expression Graph)
(a + a + b) × c (a + b + a) × c (b + a + a) × c c × (a + a + b) c × (a + b + a) c × (b + a + a) ((a + a) × c) + ( b × c) (((2 × a) + b ) × c) ((2 × a) × c) + (b × c) (c × b) + (c × (a + a)) (a × c) + (a × c) + (b × c) ((a + b) × c ) + (a × c)
. . .
2 a × + b □ +(a,a,b) × c × + c b c × a a + × × +
APEG for e = ((a + a) + b) × c.
Build the APEG of expression and search an accurate formula among it
([3.141, 3.142], [0.00059, 0.000592]) ([99.98, 99.99], [0.09, 0.1]) because
0.000592 ≤ 0.1
MetaLibm Workshop 20 / 61
SALSA Related work
1
Transformation of Expressions
2
Intraprocedural Transformation
3
Interprocedural Transformation
MetaLibm Workshop 21 / 61
SALSA Related work
⟨ c , ẟ , C , β ⟩ Command to optimize Context of c env. Var Expr Blacklist of Var Var Expr Formal Env.
while (t < 100.0 ){ ... } c 12.34 inv_l 0.1 sl = [0.52,0.53]; sr = 0.785398163397; ... c = 12.34 ; [] x
Priority on application of the transformation rules
Re-application of transformation rules on resulting program
MetaLibm Workshop 22 / 61
SALSA Related work
δ′ = δ[id → e]
id ∈ β
id = e, δ, C, β ⇒ν nop, δ′, C, β (A1)
e′ = δ(e)
σ♯ = [ [C[c]] ]♯ι♯ e′, σ♯ ❀∗ e′′ id = e, δ, C, β ⇒ν id = e′′, δ, C, β (A2) nop ; c , δ, C, β ⇒ν c, δ, C, β (S1) c ; nop , δ, C, β ⇒ν c, δ, C, β (S2)
C′ = C
ν c′ 1, δ′, C′, β′ C′′ = C[c′ 1; []]
c2, δ′, C′′, β′ ⇒ν c′
2, δ′′, C′′, β′′
c1 ; c2 , δ, C, β ⇒ν c′
1 ; c′ 2, δ′′, C, β′′
(S3) σ♯ = [ [C[ifΦ e then c1 else c2]] ]♯ι♯ [ [e] ]♯σ♯ = true c1, δ, C, β ⇒ν c′
1, δ′, C, β
ifΦ e then c1 else c2, δ, C, β ⇒ν Ψ(Φ, c′
1), Ψ(Φ, δ′), C, β
(C1) σ♯ = [ [C[ifΦ e then c1 else c2]] ]♯ι♯ [ [e] ]♯σ♯ = false c2, δ, C, β ⇒ν c′
2, δ′, C, β
ifΦ e then c1 else c2, δ, C, β ⇒ν Ψ(Φ, c′
2), Ψ(Φ, δ′), C, β
(C2)
Var(e) ∩ Dom(δ) = ∅
β′ = β ∪ Assigned(c1) ∪ Assigned(c2) c1, δ, C, β′ ⇒ν c′
1, δ1, C, β1
c2, δ, C, β′ ⇒ν c′
2, δ2, C, β2
δ′ = δ1 ∪ δ2 ifΦ e then c1 else c2, δ, C, β ⇒ν ifΦ e then c′
1 else c′ 2, δ′, C, β′
(C3)
V = Var(e) c′ = AddDefs(V, δ)
δ′ = δ|Dom(δ)\V c′; ifΦ e then c1 else c2, δ′, C, β ∪ V ⇒ν c′′, δ′, C, β′ ifΦ e then c1 else c2, δ, C, β ⇒ν c′′, δ′, C, β′ (C4)
Var(e) ∩ Dom(δ) = ∅ C′ = C[whileΦ e do []]
c, δ, C′, β ⇒ν c′, δ′, C′, β′ whileΦ e do c, δ, C, β ⇒ν whileΦ e do c′, δ′, C, β′ (W1)
V = Var(e) ∪ Var(Φ) c′ = AddDefs(V, δ)
δ′ = δ|Dom(δ)\V c′; whileΦ e do c, δ′, C, β ∪ V ⇒ν c′′, δ′, C, β′ whileΦ e do c, δ, C, β ⇒ν c′′, δ′, C, β′ (W2)
MetaLibm Workshop 23 / 61
SALSA Related work
Original Program
δ = ∅ β = {z}
C = [] x = a; if (x > 3.) then z = x + 2. + 1.; else z = x − 2. − 1.; 1 Transformed Program: Using Assignment Rules
δ′ = δ[x → a] β = {z}
C = x = a; [] if (x > 3.) then z = x + 2. + 1.; else z = x − 2. − 1.; 2 Transformed Program: Using Conditionals rules
δ = ∅ β = {z, x}
C = [] x = a; if (x > 3.) then z = x + 2. + 1.; else z = x − 2. − 1.; 3 Original Program: Using Partial Evaluation rules
δ = ∅ β = {z, x}
C = x = a; if (x > 3)then [] else [] x = a; if (x > 3.) then z = x + 3; else z = x − 3; 4
MetaLibm Workshop 24 / 61
SALSA Related work
1
Transformation of Expressions
2
Intraprocedural Transformation
3
Interprocedural Transformation
MetaLibm Workshop 25 / 61
SALSA Related work
f (u){c; return v}
z = f (e), δ, C, β →ϑ u = e; c; z = v, δ, C, β (Inlining) γ = [ [e] ]♯σ♯ σ♯ = [ [C[c]] ]♯ι♯
g(a){c′; return v} f (u){c; return v}
c, δ[u → γ], [], {v} →v c′, δ, C, β z = f (e), δ, C, β →ϑ z = g(), δ, C, β (Specialization)
f (u){c; return v}c, δ[u → e], [], {v} →z c′, δ, [], {v} g(u){c′; return v}
z = f (e), δ, C, β →ϑ z = g(Var(e)), δ, C, β (Laziness)
MetaLibm Workshop 26 / 61
SALSA Related work
assert a = [10.0, 20.0] double caller(){ x = 2.0; y = 3.0 ∗ x + 9.0; z = callee(y); return z;
}
double callee(double u){ v = (a ∗ a ∗ u ∗ u ∗ u)
+(a ∗ u ∗ u) +((a∗0.5)∗u)+0.3;
return v;
}
assert a = [10.0, 20.0] double caller(){ x = 2.0; y = 15.0; z = calleey(); return z;
}
double calleey(){ v = (a∗a∗15.0∗15.0∗15.0)
+(a ∗ 15.0 ∗ 15.0) +((a ∗ 0.5) ∗ 15.0) + 0.3;
return v;
}
assert a = [10.0, 20.0] double caller(){ x = 2.0; y = 15.0; z = calleey(); return z;
}
double calleey(){ v = ((0.5 ∗ (15.0 ∗ a))
+((0.3 + ((a ∗ 15.0) ∗ 15.0)) +((((a∗a)∗15.0)∗15.0)∗15.0)));
return v;
}
MetaLibm Workshop 27 / 61
SALSA Architecture
MetaLibm Workshop 28 / 61
SALSA Architecture
Parser Static-Analyzer Sardana Salsa-Intra Salsa-Function
MetaLibm Workshop 29 / 61
SALSA Architecture
Parser Static-Analyzer Sardana Salsa-Intra Salsa-Function
MetaLibm Workshop 30 / 61
SALSA Architecture
Parser Static-Analyzer Sardana Salsa-Intra Salsa-Function
MetaLibm Workshop 31 / 61
SALSA Architecture
Parser Static-Analyzer Sardana Salsa-Intra Salsa-Function
MetaLibm Workshop 32 / 61
SALSA Architecture
Parser Static-Analyzer Sardana Salsa-Intra Salsa-Function
MetaLibm Workshop 33 / 61
SALSA Architecture
Parser Static-Analyzer Sardana Salsa-Intra Salsa-Function
MetaLibm Workshop 34 / 61
SALSA Inputs
MetaLibm Workshop 35 / 61
SALSA Inputs
assert m = [8.0, 8.0, 0.0, 0.0] assert c = [5.0, 5.0, 0.0, 0.0] << Variables comes from sensors or introduced by user
%Salsa%
<< begin of Program double main() { eold = 0.0; t = 0.0; i = 0.0; kp = 9.4514; kd = 2.8454; dt = 0.2; invdt = 5.0; m = 0.0; while (t < 100.0) { e = c − m; p = kp ∗ e; i = integral(i, m, c, dt) ; << Caller function d = kd ∗ invdt ∗ (e − eold); r = p + i + d; eold = e; m = m + r ∗ 0.01; t = t + dt;
}
return m ; << Reference variable
}
double integral(double ii, double mm, double cc, double ddt) { ki = 0.69006; res = ii + (ki ∗ ddt ∗ (cc − mm)); return res;
}
<< Callee function
MetaLibm Workshop 36 / 61
SALSA Inputs
1
x = 2 ; If (x > 1 ) th e n x = x * 2 Els e x = x / 2 En d if ; z = x ; x 1 = 2 ; If (x 1 > 1 ) th e n x 2 = x 1 * 2 Els e x 3 = x 1 / 2 En d if ; ϕ (x 4 ,x 2 ,x 3 ) z = x 4 ; 2
value returned by the main function
3
[a, b] is the range of floating-point value [c, d] is the error range associated to [a,b]
MetaLibm Workshop 37 / 61
SALSA Inputs
sliceSize: number corresponds to the height of the syntactic tree where we slice the arithmetic expression
x = ((a + (2 .0 * b )) +c ) + ( d + e );
+ +
c d e 2 .0 b a
+ +
*
MetaLibm Workshop 38 / 61
SALSA Inputs
sliceSize: number corresponds to the height of the syntactic tree where we slice the arithmetic expression
x = ((a + (2.0 * b )) + c ) + ( d + e ); + + + + a * c d e 2.0 b sliceSize = 2 + + + c d e TMP1 = (a + (2.0 * b)) ; x = (TMP1 + c) + (d + e) ; TMP1 Before slicing After slicing
MetaLibm Workshop 39 / 61
SALSA Inputs
arguments of a function ruleSelector: selects which rule to apply widen : number of iterations allowed before applying a widening in static analysis etc.
MetaLibm Workshop 40 / 61
SALSA Outputs
MetaLibm Workshop 41 / 61
SALSA Outputs
sl = [0.52, 0.53, 0., 0.] double main(){ t = 0.0; theta = −0.985; y = 0.0; x = 0.0; arg = 0.0; deltatheta = 0.0; deltad = 0.0; deltadr = 0.0; deltadl = 0.0; while(t < 1.0){ deltadl = (12.34 ∗ sl); deltadr = 7.753450668961402; deltad = (0.5 ∗ (deltadl + deltadr)); deltatheta = (0.1 ∗ (deltadr − deltadl)); arg = (theta + (deltatheta ∗ 0.5)); z = cosiTMP2(theta, deltatheta); x = (x + (deltad ∗ z)); q = siniTMP6(theta, deltatheta); y = (y + (deltad ∗ q)); theta = (theta + deltatheta); t = (t + 0.1);
};
return y;
}
double cosiTMP2(doubletheta, doubledeltatheta){ TMP1 = (theta + (deltatheta ∗ 0.5)); b = ((1.0 − ((TMP1 ∗ TMP1) ∗ 0.5)) + ((((TMP1 ∗ TMP1) ∗ TMP1) ∗ TMP1) ∗ 0.0416)); return b;
}
double siniTMP6(doubletheta, doubledeltatheta){ TMP3 = (theta + (deltatheta ∗ 0.5)); w = ((TMP3 −(((TMP3 ∗TMP3)∗TMP3)∗0.1666))+(((((TMP3 ∗TMP3)∗TMP3)∗TMP3)∗TMP3)∗0.0083)); return w;
}
MetaLibm Workshop 42 / 61
SALSA Outputs
Original value (e.g. Odometry 10.1407240387) Transformed value (e.g. Odometry 8.71925051821 )
Absolute original error (e.g. Odometry 4.3972539271e−14) Transformed absolute error (e.g. Odometry 1.5940113894e−14)
MetaLibm Workshop 43 / 61
SALSA Experimental results
MetaLibm Workshop 44 / 61
SALSA Experimental results
1e+06 2e+06 3e+06 4e+06
1e+06 2e+06 3e+06 4e+06 5e+06 6e+06 Rocket Trajectory Computed by the Optimized Code Rocket Trajectory Computed by the Original Code
MetaLibm Workshop 45 / 61
SALSA Experimental results
Code Ori. Abs. Trans. Abs. Ori. Rel. Trans. Rel. Trans. Err. Err. Err. Err. Time (s) Odometry
5.55168e-14 2.13253e-14 7.7719e-16 3.7346e-16 0.047
PID Controller
4.66802e-14 2.13462e-16 1.6226e-15 7.4200e-17 0.121
Lead-Lag System
1.61083e-13 1.42663e-14 7.1038e-17 1.1145e-17 0.009
Runge-Kutta 4
1.26621e-15 2.77237e-16 7.1105e-16 1.6766e-16 0.022
Newton-Raphson
3.21484e-14 1.07444e-15 1.0937e-15 8.9536e-17 0.022
Simpson’s Method
1.91875e-10 9.44669e-15 1.1605e-13 6.2320e-18 0.620
Rocket Trajectory
2.85693e-07 6.04012e-10 3.7310e-11 7.8882e-13 0.086
MetaLibm Workshop 46 / 61
SALSA Experimental results
Relative Errors
1e-17 1e-15 1e-12 1e-9 O d
e t r y P I D L e a d
a g R K 4 N e w t
S i m p s
R
k e t Original Relative Error Transformed Relative Error
Codes
MetaLibm Workshop 47 / 61
SALSA Convergence Acceleration
MetaLibm Workshop 48 / 61
SALSA Convergence Acceleration
i
n
j
i
i | < ǫ
0.62 0.1 0.2
−0.3
0.3 0.602
−0.1
0.2 0.2
−0.3
0.6006 0.1
−0.1
0.2 0.3 0.601
x1 x2 x3 x4
1.0/2.0 1.0/3.0 1.0/4.0 1.0/5.0
j=4
MetaLibm Workshop 49 / 61
SALSA Convergence Acceleration
e = 1.0; eps = 10e−16; a11 = 0.61; a22 = 0.602; a33 = 0.6006; a44 = 0.601; b1 = 0.5; b2 = 1.0/3.0; b3 = 0.25; b4 = 1.0/5.0; while (e > eps) { xn1 = (b1/a11) − (0.1/a11) ∗ x2 − (0.2/a11) ∗ x3 + (0.3/a11) ∗ x4; xn2 = (b2/a22) − (0.3/a22) ∗ x1 + (0.1/a22) ∗ x3 − (0.2/a22) ∗ x4; xn3 = (b3/a33) − (0.2/a33) ∗ x1 + (0.3/a33) ∗ x2 − (0.1/a33) ∗ x4; xn4 = (b4/a44) + (0.1/a44) ∗ x1 − (0.2/a44) ∗ x2 − (0.3/a44) ∗ x3; e = xn1 − x1; x1 = xn1; x2 = xn2; x3 = xn3; x4 = xn4;
}
MetaLibm Workshop 50 / 61
SALSA Convergence Acceleration
e = 1.0; eps = 10e−16; while (e > eps) { TMP1 = (0.553709856035437 − (x1 ∗ 0.498338870431894)); TMP2 = (0.166112956810631 ∗ x3); TMP6 = (0.333000333000333 ∗ x1); xn1 = (((0.819672131147541 − (0.163934426229508 ∗ ((TMP1 + TMP2) − (0.332225913621263 ∗ x4)))) − (0.327868852459016 ∗ (((0.416250416250416 − TMP6) + (0.4995004995005 ∗ x2)) −
(0.166500166500167∗x4))))+(0.491803278688525∗(((0.332778702163062+(0.166389351081531∗
x1)) − (0.332778702163062 ∗ x2)) − (0.499168053244592 ∗ x3)))); xn2
= (((0.553709856035437 − (0.498338870431894 ∗
xn1))
+ (0.166112956810631 ∗ (((0.416250416250416 − TMP6) + (0.4995004995005 ∗ x2)) − (0.166500166500167 ∗ x4)))) − (0.332225913621263 ∗ (((0.332778702163062 + (0.166389351081531 ∗ x1)) − (0.332778702163062 ∗
x2)) − (0.499168053244592 ∗ x3)))); xn3
= (((0.416250416250416 − (0.333000333000333 ∗ xn1)) + (0.4995004995005 ∗ xn2)) − (0.166500166500167 ∗ (((0.332778702163062 + (0.166389351081531 ∗ x1)) − (0.332778702163062 ∗
x2)) − (0.499168053244592 ∗ x3)))); xn4
= (((0.332778702163062 + (0.166389351081531 ∗ xn1)) − (0.332778702163062 ∗ xn2)) − (0.499168053244592 ∗ xn3));
e = (xn4 − x4); x1 = xn1; x2 = xn2; x3 = xn3; x4 = xn4;
}
MetaLibm Workshop 51 / 61
SALSA Convergence Acceleration
Number of iterations of Jacobi’s method before and after optimization to compute xi, 1 ≤ i ≤ 4 xi
Nbre it initial Nbre it optimized Difference Percentage
x1
1891 1628
−263
14.0
x2
2068 1702
−366
17.3
x3
2019 1702
−317
15.7
x4
1953 1628
−325
16.7
MetaLibm Workshop 52 / 61
SALSA Convergence Acceleration
Code Exec. timeo(s) Exec. timet % Code sizeo Code sizet
codesizeo codesizet
Odometry
0.049 0.038 22.44 808 2.1 K 0.38
PID
0.055 0.025 54.54 472 573 0.82
Lead-Lag Sys.
0.049 0.046 6.12 618 752 0.82
Runge-Kutta 4
0.047 0.046 2.12 697 1.4 K 0.49
Newton
0.059 0.047 20.33 465 1.1 K 0.42
Simpson’s
0.082 0.051 37.80 648 4.2 K 0.15
Rocket
0.055 0.047 14.54 1.6K 2.9 K 0.55
MetaLibm Workshop 53 / 61
SALSA Convergence Acceleration
Floating-point operations needed by numerical iterative methods to converge (Flops)
♯ of ± per it ♯ of ± per it Total ♯ of ± Total ♯ of ± opt Percentage of Method Original Code Optimized Code Original Code Optimized Code Improvement Jacobi
13 15 25389 24420 3.81
Newton
11 11 3465 132 96.19
Eigenvalue
15 15 694080 685995 1.16
Gram-Schmidt
21 19 791364 715996 9.52
♯ of × per it ♯ of × per it Total ♯ of × Total ♯ of × opt Percentage of Method Original Code Optimized Code Original Code Optimized Code Improvement Jacobi
28 14 54684 22792 58.32
Newton
27 26 8505 312 96.33
Eigenvalue
19 19 879168 868927 1.16
Gram-Schmidt
22 20 712316 647560 9.09
MetaLibm Workshop 54 / 61
SALSA Single vs Double Precision?
a
n 2 −1
n 2
MetaLibm Workshop 55 / 61
SALSA Single vs Double Precision?
Developed form of polynomial evaluates very poorly close to a root Problems due to floating-point errors f (x) = (x − 2)7 f (x) = x7 − 14× x6 + 84× x5 − 280× x4 + 560× x3 − 672× x2 + 448× x − 128
MetaLibm Workshop 56 / 61
SALSA Single vs Double Precision?
MetaLibm Workshop 57 / 61
SALSA Multi-criteria optimization
1
2
3
4
MetaLibm Workshop 58 / 61
SALSA Multi-criteria optimization
Original Program (eq. tree) Transformed Program (eq. tree) Code Initial error Transfo. error transfo. time (s) Initial error Transfo. error transfo. time (s) Odometry
4.9801e−13 1.9829e−13 0.098 2.5637e−14 1.9829e−15 0.090
Jacobi
2.9142e−16 1.7258e−16 1.098 2.5658e−16 1.5517e−16 0.125
PID
4.6680e−14 2.1346e−16 0.125 2.5637e−15 1.9829e−16 0.098
Runge-Kutta 4
4.6666e−13 2.9226e−13 0.098 4.6047e−14 2.9253e−15 0.067
Original Program (op. nbre) Transformed Program (op. nbre) Code Initial error Transfo. error transfo. time (s) Initial error Transfo. error transfo. time (s) Odometry
4.9801e−13 1.9829e−13 0.098 2.4011e−14 1.8574e−15 0.091
Jacobi
2.9142e−16 1.7258e−16 1.098 1.7176e−16 4.4408e−17 0.115
PID
4.6680e−14 2.1346e−16 0.125 2.8574e−15 1.5211e−15 0.100
Runge-Kutta 4
4.6666e−13 2.9226e−13 0.098 4.6805e−14 2.9312e−16 0.751
Original Program (eq. & op.) Transformed Program (eq. & op.) Code Initial error Transfo. error transfo. time (s) Initial error Transfo. error transfo. time (s) Odometry
4.9801e−13 1.9829e−13 0.098 1.5847e−14 1.9229e−15 0.080
Jacobi
2.9142e−16 1.7258e−16 1.098 1.5658e−16 1.5017e−16 0.120
PID
4.6680e−14 2.1346e−16 0.125 2.5622e−15 1.9829e−16 0.070
Runge-Kutta 4
4.6666e−13 2.9226e−13 0.098 3.6095e−14 .9253e−15 0.050
MetaLibm Workshop 59 / 61
SALSA Conclusion
MetaLibm Workshop 60 / 61
SALSA Conclusion
MetaLibm Workshop 61 / 61