Source/Packages

Hardware.Nvidia.SM86.Command.AffineLaunchSchedule

packages/hardware/architectures/nvidia-sm86/src/Hardware/Nvidia/SM86/Command/AffineLaunchSchedule.alpha

339 lines14 declarations12.8 KiBSHA-256 dffcec57fac1

Complete file · line 244

AffineLaunchSchedule.alpha

Definition view
1module Hardware.Nvidia.SM86.Command.AffineLaunchSchedule
2
3import Hardware.Nvidia.SM86.Command.WholeProgramPlan
4import Model.Parameter
5import Model.Word64
6import Std.Natural
7import Std.Word
8
9-- A repeated body may change only its parameter words between iterations.
10-- Compare adjacent body instances by launch ordinal and word. Differences
11-- are modulo 2^64 because device pointers are encoded as 64-bit words. The
12-- body is retained once; WholeProgramPlan expands its affine parameters
13-- when it emits the launch-table recipe. Callers prove the body shape and
14-- pointer progression for the geometry they instantiate.
15def nvidiaAffineNoLaunches : (family NvidiaLaunchSchedule) =
16  (constructor NvidiaLaunchSchedule NvidiaLaunchScheduleEmpty)
17def nvidiaAffineScheduleIf =
18  (lambda unrestricted condition : Nat .
19    (lambda unrestricted whenTrue : (family NvidiaLaunchSchedule) .
20      (lambda unrestricted whenFalse : (family NvidiaLaunchSchedule) .
21        (nat-eliminate
22          (lambda unrestricted current : Nat . (family NvidiaLaunchSchedule))
23          whenFalse
24          (lambda unrestricted p : Nat .
25            (lambda unrestricted induction : (family NvidiaLaunchSchedule) . whenTrue))
26          condition))))
27
28def nvidiaAffineWordMaximum : Nat =
29  (modelWord64Natural stdU64AllOnes)
30
31def nvidiaAffineWordDifference =
32  (lambda unrestricted a : Nat .
33    (lambda unrestricted b : Nat .
34      (naturalSelect
35        (naturalLessOrEqual a b)
36        (naturalSaturatingSubtract b a)
37        (naturalSaturatingSubtract
38          nvidiaAffineWordMaximum
39          (naturalSaturatingSubtract (naturalSaturatingSubtract a b) 1)))))
40
41def nvidiaAffinePatchValue =
42  (lambda unrestricted patches : (family NvidiaParameterPatches) .
43    (lambda unrestricted word : Nat .
44      (eliminate
45        NvidiaParameterPatches
46        (lambda unrestricted current : (family NvidiaParameterPatches) . Nat)
47        patches
48        (branch NvidiaParameterPatchesEnd . 0)
49        (branch
50          NvidiaParameterPatchesNext
51          head
52          tail
53          induction
54          .
55          (eliminate
56            NvidiaParameterPatch
57            (lambda unrestricted current : (family NvidiaParameterPatch) . Nat)
58            head
59            (branch
60              NvidiaParameterPatchValue
61              at
62              value
63              .
64              (naturalSelect (naturalEqual at word) (modelWord64Natural value) induction)))))))
65
66def nvidiaAffinePatchPresent =
67  (lambda unrestricted patches : (family NvidiaParameterPatches) .
68    (lambda unrestricted word : Nat .
69      (eliminate
70        NvidiaParameterPatches
71        (lambda unrestricted current : (family NvidiaParameterPatches) . Nat)
72        patches
73        (branch NvidiaParameterPatchesEnd . 0)
74        (branch
75          NvidiaParameterPatchesNext
76          head
77          tail
78          induction
79          .
80          (eliminate
81            NvidiaParameterPatch
82            (lambda unrestricted current : (family NvidiaParameterPatch) . Nat)
83            head
84            (branch
85              NvidiaParameterPatchValue
86              at
87              value
88              .
89              (naturalOr (naturalEqual at word) induction)))))))
90
91def nvidiaAffinePatchesOf =
92  (lambda unrestricted template : (family NvidiaLaunchTemplate) .
93    (eliminate
94      NvidiaLaunchTemplate
95      (lambda unrestricted current : (family NvidiaLaunchTemplate) .
96        (family NvidiaParameterPatches))
97      template
98      (branch
99        NvidiaLaunchTemplateValue
100        identity
101        kernel
102        block
103        .
104        (eliminate
105          NvidiaParameterBlock
106          (lambda unrestricted current : (family NvidiaParameterBlock) .
107            (family NvidiaParameterPatches))
108          block
109          (branch NvidiaParameterBlockValue patches . patches)))))
110
111def nvidiaAffineAdjust =
112  (lambda unrestricted ordinal : Nat .
113    (lambda unrestricted word : Nat .
114      (lambda unrestricted delta : Nat .
115        (lambda unrestricted tail : (family NvidiaParameterAdjustments) .
116          (nat-eliminate
117            (lambda unrestricted current : Nat . (family NvidiaParameterAdjustments))
118            tail
119            (lambda unrestricted q : Nat .
120              (lambda unrestricted ignored : (family NvidiaParameterAdjustments) .
121                (constructor
122                  NvidiaParameterAdjustments
123                  NvidiaParameterAdjustmentsNext
124                  (constructor
125                    NvidiaParameterAdjustment
126                    NvidiaParameterAdjustmentValue
127                    (constructor
128                      NvidiaParameterAdjustmentScope
129                      NvidiaParameterAdjustmentBlock
130                      ordinal)
131                    word
132                    (modelWord64FromNaturalTruncated delta))
133                  tail)))
134            (naturalNonzero delta))))))
135
136-- Compare sparse words for one launch. An absent word is zero in the launch
137-- table, so additions and removals are deltas from or to zero. The ordinal
138-- scope prevents a pointer in one kernel from relocating the same ABI slot
139-- when that slot is a scalar in another kernel.
140def nvidiaAffineBlockDeltas =
141  (lambda unrestricted ordinal : Nat .
142    (lambda unrestricted first : (family NvidiaParameterPatches) .
143      (lambda unrestricted second : (family NvidiaParameterPatches) .
144        (lambda unrestricted tail : (family NvidiaParameterAdjustments) .
145          (eliminate
146            NvidiaParameterPatches
147            (lambda unrestricted current : (family NvidiaParameterPatches) .
148              (family NvidiaParameterAdjustments))
149            first
150            (branch
151              NvidiaParameterPatchesEnd
152              .
153              (eliminate
154                NvidiaParameterPatches
155                (lambda unrestricted current : (family NvidiaParameterPatches) .
156                  (family NvidiaParameterAdjustments))
157                second
158                (branch NvidiaParameterPatchesEnd . tail)
159                (branch
160                  NvidiaParameterPatchesNext
161                  head
162                  rest
163                  induction
164                  .
165                  (eliminate
166                    NvidiaParameterPatch
167                    (lambda unrestricted current : (family NvidiaParameterPatch) .
168                      (family NvidiaParameterAdjustments))
169                    head
170                    (branch
171                      NvidiaParameterPatchValue
172                      word
173                      value
174                      .
175                      (nat-eliminate
176                        (lambda unrestricted current : Nat . (family NvidiaParameterAdjustments))
177                        (nvidiaAffineAdjust ordinal word (modelWord64Natural value) induction)
178                        (lambda unrestricted q : Nat .
179                          (lambda unrestricted ignored : (family NvidiaParameterAdjustments) .
180                            induction))
181                        (nvidiaAffinePatchPresent first word)))))))
182            (branch
183              NvidiaParameterPatchesNext
184              head
185              rest
186              induction
187              .
188              (eliminate
189                NvidiaParameterPatch
190                (lambda unrestricted current : (family NvidiaParameterPatch) .
191                  (family NvidiaParameterAdjustments))
192                head
193                (branch
194                  NvidiaParameterPatchValue
195                  word
196                  value
197                  .
198                  (nvidiaAffineAdjust
199                    ordinal
200                    word
201                    (nvidiaAffineWordDifference (modelWord64Natural value) (nvidiaAffinePatchValue second word))
202                    induction)))))))))
203
204def nvidiaAffineOneOf =
205  (lambda unrestricted schedule : (family NvidiaLaunchSchedule) .
206    (eliminate
207      NvidiaLaunchSchedule
208      (lambda unrestricted current : (family NvidiaLaunchSchedule) .
209        (family NvidiaParameterPatches))
210      schedule
211      (branch
212        NvidiaLaunchScheduleEmpty
213        .
214        (constructor NvidiaParameterPatches NvidiaParameterPatchesEnd))
215      (branch NvidiaLaunchScheduleOne template . (nvidiaAffinePatchesOf template))
216      (branch
217        NvidiaLaunchScheduleAppend
218        left
219        right
220        il
221        ir
222        .
223        (constructor NvidiaParameterPatches NvidiaParameterPatchesEnd))
224      (branch
225        NvidiaLaunchScheduleRepeat
226        count
227        iteration
228        body
229        ib
230        .
231        (constructor NvidiaParameterPatches NvidiaParameterPatchesEnd))))
232
233def nvidiaAffineLeftOf =
234  (lambda unrestricted schedule : (family NvidiaLaunchSchedule) .
235    (eliminate
236      NvidiaLaunchSchedule
237      (lambda unrestricted current : (family NvidiaLaunchSchedule) . (family NvidiaLaunchSchedule))
238      schedule
239      (branch NvidiaLaunchScheduleEmpty . schedule)
240      (branch NvidiaLaunchScheduleOne template . schedule)
241      (branch NvidiaLaunchScheduleAppend left right il ir . left)
242      (branch NvidiaLaunchScheduleRepeat count iteration body ib . body)))
243
244def nvidiaAffineRightOf =
245  (lambda unrestricted schedule : (family NvidiaLaunchSchedule) .
246    (eliminate
247      NvidiaLaunchSchedule
248      (lambda unrestricted current : (family NvidiaLaunchSchedule) . (family NvidiaLaunchSchedule))
249      schedule
250      (branch NvidiaLaunchScheduleEmpty . schedule)
251      (branch NvidiaLaunchScheduleOne template . schedule)
252      (branch NvidiaLaunchScheduleAppend left right il ir . right)
253      (branch NvidiaLaunchScheduleRepeat count iteration body ib . body)))
254
255-- the deltas between two bodies of the same shape, blocks numbered in the
256-- expanded body from `offset`; a nested repeat's difference applies to
257-- every copy of its body
258def nvidiaAffineDeltas =
259  (lambda unrestricted first : (family NvidiaLaunchSchedule) .
260    (eliminate
261      NvidiaLaunchSchedule
262      (lambda unrestricted current : (family NvidiaLaunchSchedule) .
263        (pi unrestricted second : (family NvidiaLaunchSchedule) .
264          (pi unrestricted offset : Nat .
265            (pi unrestricted tail : (family NvidiaParameterAdjustments) .
266              (family NvidiaParameterAdjustments)))))
267      first
268      (branch
269        NvidiaLaunchScheduleEmpty
270        .
271        (lambda unrestricted second : (family NvidiaLaunchSchedule) .
272          (lambda unrestricted offset : Nat .
273            (lambda unrestricted tail : (family NvidiaParameterAdjustments) . tail))))
274      (branch
275        NvidiaLaunchScheduleOne
276        template
277        .
278        (lambda unrestricted second : (family NvidiaLaunchSchedule) .
279          (lambda unrestricted offset : Nat .
280            (lambda unrestricted tail : (family NvidiaParameterAdjustments) .
281              (nvidiaAffineBlockDeltas offset (nvidiaAffinePatchesOf template) (nvidiaAffineOneOf second) tail)))))
282      (branch
283        NvidiaLaunchScheduleAppend
284        left
285        right
286        il
287        ir
288        .
289        (lambda unrestricted second : (family NvidiaLaunchSchedule) .
290          (lambda unrestricted offset : Nat .
291            (lambda unrestricted tail : (family NvidiaParameterAdjustments) .
292              (il
293                (nvidiaAffineLeftOf second)
294                offset
295                (ir (nvidiaAffineRightOf second) (naturalAdd offset (nvidiaLaunchScheduleCount left)) tail))))))
296      (branch
297        NvidiaLaunchScheduleRepeat
298        count
299        iteration
300        body
301        ib
302        .
303        (lambda unrestricted second : (family NvidiaLaunchSchedule) .
304          (lambda unrestricted offset : Nat .
305            (lambda unrestricted tail : (family NvidiaParameterAdjustments) .
306              (nat-eliminate
307                (lambda unrestricted current : Nat . (family NvidiaParameterAdjustments))
308                tail
309                (lambda unrestricted p : Nat .
310                  (lambda unrestricted induction : (family NvidiaParameterAdjustments) .
311                    (ib
312                      (nvidiaAffineRightOf second)
313                      (naturalAdd offset (naturalMultiply p (nvidiaLaunchScheduleCount body)))
314                      induction)))
315                count)))))))
316
317-- `count` bodies of an affine loop, as one Repeat
318def nvidiaAffineLaunchRepeat =
319  (lambda unrestricted count : Nat .
320    (lambda unrestricted body : (pi unrestricted index : Nat . (family NvidiaLaunchSchedule)) .
321      (nvidiaAffineScheduleIf
322        (naturalLess count 2)
323        (nvidiaAffineScheduleIf (naturalIsZero count) nvidiaAffineNoLaunches (body 0))
324        (let unrestricted first =
325          (body 0)
326          in
327          (constructor
328            NvidiaLaunchSchedule
329            NvidiaLaunchScheduleRepeat
330            count
331            (constructor
332              NvidiaParameterIteration
333              NvidiaParameterIterationAffine
334              (nvidiaAffineDeltas
335                first
336                (body 1)
337                0
338                (constructor NvidiaParameterAdjustments NvidiaParameterAdjustmentsEnd)))
339            first)))))

The compiler supplied declaration spans and resolved links from this source snapshot. This page does not assert that this file belongs to a checked closure.