1 Introduction Template Metaprogramming TMP in Armadillo Conclusion Armadillo: Template Metaprogramming for Linear Algebra Leo Antunes and Markus Kruber Seminar on Automation, Compilers, and Code-Generation HPAC June 2014 Leo Antunes and Markus Kruber Armadillo
45
Embed
Armadillo: Template Metaprogramming for Linear Algebrahpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf · C++ Templates Overview Examples Template Metaprogramming. Use C++ templates
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
. Determines ”depth” of expression: N = 3(amount of operators with same precedence)
. Pattern matches specialized function for N = 3 which:
. Decide (ABC )D vs. A(BCD)
. Heuristic: cost(ABC ) := columns(A) · rows(C )
. Recursively calls reordering function with N = 2
. Thus: linear (but sub-optimal) reordering of operations
. Remember: all this at compile-time!
Leo Antunes and Markus Kruber Armadillo
13
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Complex example: A*B*C*D (cont.)
. ((AB)C )D 3
⇒ O(n3)
. (A(BC ))D 3
⇒ O(n3)
. A((BC )D) 3
⇒ O(n3)
. A(B(CD)) 3
⇒ O(n3)
. (AB)(CD) 7
⇒ O(n2)
n Armadillo All
3 2 24 4 55 8 146 16 427 32 132
n
n
A
1
n
B
n1
C
n
n
D
Leo Antunes and Markus Kruber Armadillo
13
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Complex example: A*B*C*D (cont.)
. ((AB)C )D 3
⇒ O(n3)
. (A(BC ))D 3
⇒ O(n3)
. A((BC )D) 3
⇒ O(n3)
. A(B(CD)) 3
⇒ O(n3)
. (AB)(CD) 7
⇒ O(n2)
n Armadillo All
3 2 24 4 55 8 146 16 427 32 132
n
n
A
1
n
B
n1
C
n
n
D
Leo Antunes and Markus Kruber Armadillo
13
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Complex example: A*B*C*D (cont.)
. ((AB)C )D 3 ⇒ O(n3)
. (A(BC ))D 3 ⇒ O(n3)
. A((BC )D) 3 ⇒ O(n3)
. A(B(CD)) 3 ⇒ O(n3)
. (AB)(CD) 7 ⇒ O(n2)
n Armadillo All
3 2 24 4 55 8 146 16 427 32 132
n
n
A
1
n
B
n1
C
n
n
D
Leo Antunes and Markus Kruber Armadillo
13
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Complex example: A*B*C*D (cont.)
. ((AB)C )D 3 ⇒ O(n3)
. (A(BC ))D 3 ⇒ O(n3)
. A((BC )D) 3 ⇒ O(n3)
. A(B(CD)) 3 ⇒ O(n3)
. (AB)(CD) 7 ⇒ O(n2)
n Armadillo All
3 2 24 4 55 8 146 16 427 32 132
n
n
A
1
n
B
n1
C
n
n
D
Leo Antunes and Markus Kruber Armadillo
14
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Other improvements
. A = A1 + A2 + . . . + An
No temporary matrix besides output
. y = A−1x → y = solve(A, x)Faster and more accurate
. inv(diag(A))Elementwise inverse
. as scalar(r ∗ X ∗ q) with r ∈ R1×n,X ∈ Rn×n, q ∈ Rn×1
Result of computation is 1× 1 matrix
. Lots more!
Leo Antunes and Markus Kruber Armadillo
14
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Other improvements
. A = A1 + A2 + . . . + An
No temporary matrix besides output
. y = A−1x → y = solve(A, x)Faster and more accurate
. inv(diag(A))Elementwise inverse
. as scalar(r ∗ X ∗ q) with r ∈ R1×n,X ∈ Rn×n, q ∈ Rn×1
Result of computation is 1× 1 matrix
. Lots more!
Leo Antunes and Markus Kruber Armadillo
14
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Other improvements
. A = A1 + A2 + . . . + An
No temporary matrix besides output
. y = A−1x → y = solve(A, x)Faster and more accurate
. inv(diag(A))Elementwise inverse
. as scalar(r ∗ X ∗ q) with r ∈ R1×n,X ∈ Rn×n, q ∈ Rn×1
Result of computation is 1× 1 matrix
. Lots more!
Leo Antunes and Markus Kruber Armadillo
14
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Other improvements
. A = A1 + A2 + . . . + An
No temporary matrix besides output
. y = A−1x → y = solve(A, x)Faster and more accurate
. inv(diag(A))Elementwise inverse
. as scalar(r ∗ X ∗ q) with r ∈ R1×n,X ∈ Rn×n, q ∈ Rn×1
Result of computation is 1× 1 matrix
. Lots more!
Leo Antunes and Markus Kruber Armadillo
14
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
OverviewExamples
Other improvements
. A = A1 + A2 + . . . + An
No temporary matrix besides output
. y = A−1x → y = solve(A, x)Faster and more accurate
. inv(diag(A))Elementwise inverse
. as scalar(r ∗ X ∗ q) with r ∈ R1×n,X ∈ Rn×n, q ∈ Rn×1
Result of computation is 1× 1 matrix
. Lots more!
Leo Antunes and Markus Kruber Armadillo
15
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
Conclusion
3 Easy to use for non-LA-experts
3 Some optimization comes built-in
7 Cannot optimize all cases
7 Debugging for more complex code can be a problem (C++)
. Our recommendation: Use it! Don’t try to understand it.
Leo Antunes and Markus Kruber Armadillo
15
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
Conclusion
3 Easy to use for non-LA-experts
3 Some optimization comes built-in
7 Cannot optimize all cases
7 Debugging for more complex code can be a problem (C++)
. Our recommendation: Use it! Don’t try to understand it.
Leo Antunes and Markus Kruber Armadillo
15
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
Conclusion
3 Easy to use for non-LA-experts
3 Some optimization comes built-in
7 Cannot optimize all cases
7 Debugging for more complex code can be a problem (C++)
. Our recommendation: Use it! Don’t try to understand it.
Leo Antunes and Markus Kruber Armadillo
16
IntroductionTemplate Metaprogramming
TMP in ArmadilloConclusion
Thanks! Questions?
Sources:
i Conrad Sanderson, Armadillo: An Open Source C++ Linear AlgebraLibrary for Fast Prototyping and Computationally Intensive Experiments,Technical Report, NICTA, 2010.
i Armadillo source code.
i C++ Programming, chapter Template Meta-Programming, Wikibooks