5. è Vlo s /
– DLLI, D FEA F GC H C
è
– . / W
– re hn gb pR sa W
• re hn
• i sa U gb pR sa
– iR xU PdRlv S
• iR , N+ -:6 8 0: 64 4/4- 2 2 N CHG
• t , 6 4: . . 8I G. 8I G2 6 LF 6 L F
)
O ( + 1EN L .H IH LEHG -FF ECDL M A
[1] J.Ragan-Kelley, et al, Halide: A Language and Compiler for Optimizing Parallelism, Locality, and Recomputation in Image Processing Pipelines, PLDI 2013
6. ) ) ) ( (
è iL a v lD
– x A
– iC H
• a n e
• gdLr s h iC H
• FLo L
è 10 D
a l
– t
– 5202. L p
0 5 5 5 0 2 11 50. 5 58
7. èd a
è a S
– c
– 0 6 C e
– F
– A
8 6 2 2 6 21 00 .6
13. 1
è c M [ sc
– A
• v dhon r sgt Ra
–
• Iuhr
• d Ie p mIpe iI
è n mx ic T ]y l T
– cS Pa ]
– n mx ic S Pa
T
H F C A ) A A C ( A C A8 8A 8
0 2 . 8C ( C C 6 G 16 8 , 8 8 A 68 8 8 (). 1 0( ,
19. è) 0 a d C eg
èov
– s hrF eg
– FH i
• A a FH plA
– tn
( 8 2 2 21 00 .
20. 8 98 8 2 1 1 10
f(x, y) = in(x, y) + 1;
produce f$1 {
let f.y.loop_max = f.y.max
let f.y.loop_min = f.y.min
let f.y.loop_extent = ((f.y.max + 1) - f.y.min)
let f.x.loop_max = f.x.max
let f.x.loop_min = f.x.min
let f.x.loop_extent = ((f.x.max + 1) - f.x.min)
for (f.y, f.y.loop_min, f.y.loop_extent) {
for (f.x, f.x.loop_min, f.x.loop_extent) {
f(f.x, f.x) = in(f.x, f.y) + 1
}
}
}
28 9 1
8 1 10 01 .
21. M & FG EF )CEDCE G CB E GF E F EI
.
00 1 ) FH8F GF
0C E B
(CHB F B E B
GG B B
2 CDG A L G CB
0CCD 2 EG G CB
)
)C
A B G CB
. 2EC E A
2 FF
BEC B
GCE L G CB
22. èIRVisitor IRGraphVisitor
– R a 0 0
• rt a
• IRGraphVisitor d e V C a
– n ol s C i V
èIRMutator
– C rt FV 0 0
– vh V A i V
è p VA I gx V
0 0 2 11 0./ 8
23. è A8 C
2 12 10 1 . 1 2 1 2 1
class PrintLoops : public IRVisitor {
using IRVisitor::visit;
void visit(const For *op) {
std::cout << op->name << std::endl;
IRVisitor::visit(op);
}
};
void print_loops(Stmt s) {
PrintLoops v;
s.accept(v);
}
24. èF AI
0 3 3 032 11 0. 8
class PrintLoops : public IRVisitor {
using IRVisitor::visit;
void visit(const For *op) {
std::cout << op->name << std::endl;
IRVisitor::visit(op);
}
};
void print_loops(Stmt s) {
PrintLoops v;
s.accept(v);
}
0 0 3 CA CA
25. è 8
4 2 02102 4 0 .. 2 4 2 2
class PrintLoops : public IRVisitor {
using IRVisitor::visit;
void visit(const For *op) {
std::cout << op->name << std::endl;
IRVisitor::visit(op);
}
};
void print_loops(Stmt s) {
PrintLoops v;
s.accept(v);
}
02C8 4 A8 8F
26. è F
8 . 5 1 21 5.10 . 5
class PrintLoops : public IRVisitor {
using IRVisitor::visit;
void visit(const For *op) {
std::cout << op->name << std::endl;
IRVisitor::visit(op);
}
};
void print_loops(Stmt s) {
PrintLoops v;
s.accept(v);
}
1 F
C A F
27. è F SCL A
0 8 6 6 6 80 11 60. 8 6 6
class PrintLoops : public IRVisitor {
using IRVisitor::visit;
void visit(const For *op) {
std::cout << op->name << std::endl;
IRVisitor::visit(op);
}
};
void print_loops(Stmt s) {
PrintLoops v;
s.accept(v);
}
828C 60 8
A C P
29. è o A A
è hAg C n n e adli
– C A Ag
– n
– n A 8 A F
– n A A
2 12 10 1 . 1 2 1 2 1
30. ) )( )
è bnky ) )( )
– p
• p
• p
• p s p PC
• p dg PC
– p x p t S
• 1 8 1 . 1 S
– l o aedv 01 i r P
– t crh pv F M
è +8 10 801 , 8+ u
A 8 98 8 2 1 1 10
31. 8 Ss
8 . 1 1 c A vu S
–
• 1 . 48 1 8 S n
–
• 1 . 48 1 8 c . 1 1 ha S n
–
• V d V S n
vu l t S P
i IC Sx a S 310 54 2 48 c
i
or mpSiC A e F g S P
4 . 8 8 . 48 55 423 1 1 10
32. è 1 8 0 3 ed
è 1 : ! F 1 8 :18 "#
I GP
– ! 1 :
– $%
1 8 0 3
• D a VS
– &%
21 .1 1:
• D ed D a bc
C 8 1 ) 1 8 ( 8 A
"#
= $ D#
×($#
, &#
, 1).
≥ 0}
33. è AC
– 1 8 1 8
• !"#
= (&, ()
– 8. 1 1
• *"#
= (+, ,)
– 1 8 1 8 P
• 0 ≤ & < + (⇒ 0 ≤ & ≤ + − 1)
• 0 ≤ ( < , (⇒ 0 ≤ ( ≤ , − 1)
8 8 8 23 1 1 10
G I F
for (y=0; y<H; y++)
for (x=0; x<W; x++) {
S1: s = 0; //S1
for (ky=0; y<KS; ky++)
for (kx=0; x<KS; kx++)
S2: s += src[y+ky][x+kx] * kernel[ky][kx];
S3: dst[y][x] = s >> t;
}
35. è 2 C
A D"#
C
è D"$
C
8 . 4 34 13213 .10 3. 4 3 4 3
%"# = { (, * |
1 0 0 0 0
−1 0 1 0 −1
0 1 0 0 0
0 −1 0 1 −1
(
*
H
W
1
≥ 2}
%"$ = (, *, 4(, 4*
1 0 0 0 0 0 0 0
−1 0 1 0 0 0 0 −1
0 1 0 0 0 0 0 0
0 −1 0 1 0 0 0 −1
0 0 1 0 0 0 0 0
0 0 −1 0 0 0 1 −1
0 0 0 1 0 0 0 0
0 0 0 −1 0 0 0 −1
(
*
4(
4*
H
W
KS
1
≥ 2}
%"#
F
for (y=0; y<H; y++)
for (x=0; x<W; x++) {
S1: s = 0; //S1
for (ky=0; y<KS; ky++)
for (kx=0; x<KS; kx++)
S2: s += src[y+ky][x+kx] * kernel[ky][kx];
S3: dst[y][x] = s >> t;
}
O W-1
H-1
y
x
36. è 050 F VC
è 050 ! 0 3 ,0. "#
A .20 3 1
. 3 $#
("#
) F S
è$#' "#' ≪ $#) "#) ⇒ (!+, "#') (!-, "#)) I
– (≪: A )
3 8 3 312 0 0 0
$#
("#
) = Θ#
×("#
, 2, 1)4
37. è F d 6 e
è . e N F 6 a
– S F g S
è T S P AC
2 8 2 6 201 .
3
3
for (y=0; y<H; y++)
for (x=0; x<W; x++) {
S1: s = 0; //S1
for (ky=0; ky<KS; ky++)
for (kx=0; kx<KS; kx++)
S2: s += src[y+ky][x+kx] * kernel[ky][kx];
S3: dst[y][x] = s >> t;
}
!"#
$, & = 0, $, 0, &, 0 )
!"* $, &, +$, +& = 0, $, 0, &, 1, +$, 0, +&, 0 )
!"- $, & = 0, $ 0, &, 2 )
T S P
T S PF
43. è 2 28 D CVihFh I
2 8 .20 e S I
– e F 2 gc
è 2 28 ! " 2 281280 , 421
#$%&
P dL a
A 8 4 2 2 21
#$%& = ()*, ),)
.$
.&
/$%&
×()$, )&, 1$, 1&, 1)&
≥
≥
=
4}
49. è yit
– 0 F8 2 / ro sm
• - 2 2
• 148 C C 4
• / F 44 AA C 4
– x eHagl kc dHe
• vb e uM kph
– -0uM . 2 F P S y n L I
è H
– 8 A 8C 4 2: 2 C 2 F8 2
A 2 A 2 8 A A D
50. èF I A
– 0 8 4 20/9.4 /04 HC
è . 4
.9 98 9. 44 9 12 90 09 0/
Func matmul(Func a, Func b, int size)
{
Func c;
Var i, j;
RDom k(0, size);
c(i, j) = 0;
c(i, j) += a(k, j) * b(i, k);
return c;
}
for (c$3.s0.j, c$3.s0.j.loop_min, c$3.s0.j.loop_extent) {
for (c$3.s0.i, c$3.s0.i.loop_min, c$3.s0.i.loop_extent) {
c$3(c$3.s0.i, c$3.s0.j) = 0
}
}
for (c$3.s1.j, c$3.s1.j.loop_min, c$3.s1.j.loop_extent) {
for (c$3.s1.i, c$3.s1.i.loop_min, c$3.s1.i.loop_extent) {
for (c$3.s1.r78$x, 0, 100) {
c$3(c$3.s1.i, c$3.s1.j) = (c$3(c$3.s1.i, c$3.s1.j) +
(a$3(c$3.s1.r78$x, c$3.s1.j)*b$3(c$3.s1.i, c$3.s1.r78$x)))
}
}
}
.4 /0 .4 /0