orka_b455160b/orka/src/orka/interface/orka-jobs-system.ads

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
--  SPDX-License-Identifier: Apache-2.0
--
--  Copyright (c) 2017 onox <denkpadje@gmail.com>
--
--  Licensed under the Apache License, Version 2.0 (the "License");
--  you may not use this file except in compliance with the License.
--  You may obtain a copy of the License at
--
--      http://www.apache.org/licenses/LICENSE-2.0
--
--  Unless required by applicable law or agreed to in writing, software
--  distributed under the License is distributed on an "AS IS" BASIS,
--  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--  See the License for the specific language governing permissions and
--  limitations under the License.

with System.Multiprocessors;

with Orka.Jobs.Executors;
with Orka.Jobs.Queues;
with Orka.Jobs.Workers;

generic
   Maximum_Queued_Jobs : Positive;
   --  Maximum number of jobs that can be enqueued
   --
   --  Should be no less than the largest width (number of jobs at a
   --  particular level) of any job graph.

   Maximum_Job_Graphs  : Positive;
   --  Maximum number of separate job graphs
   --
   --  For each job graph, a Future object is acquired. The number of
   --  concurrent acquired objects is bounded by this number.
package Orka.Jobs.System is

   package Queues is new Jobs.Queues
     (Maximum_Graphs => Maximum_Job_Graphs,
      Capacity       => Maximum_Queued_Jobs);

   Queue : aliased Queues.Queue;

   Number_Of_Workers : constant Standard.System.Multiprocessors.CPU;

   procedure Execute_GPU_Jobs;
   --  Dequeue and execute GPU jobs in the calling task

   procedure Shutdown;

private

   package SM renames Standard.System.Multiprocessors;

   use type SM.CPU;

   Number_Of_Workers : constant SM.CPU := SM.Number_Of_CPUs - 1;
   --  For n logical CPU's we spawn n - 1 workers (1 CPU is dedicated
   --  to rendering)

   package Executors is new Jobs.Executors
     (Queues, Maximum_Enqueued_By_Job => Maximum_Queued_Jobs);

   package Workers is new Jobs.Workers
     (Executors, Queue'Access, "Worker", Number_Of_Workers);

   procedure Shutdown renames Workers.Shutdown;

end Orka.Jobs.System;