|
|
"""
|
|
|
virtual_gpu_driver/src/command_queue.py
|
|
|
Command queue and scheduler for compute/graphics commands.
|
|
|
"""
|
|
|
import threading
|
|
|
import queue
|
|
|
|
|
|
class Command:
|
|
|
def __init__(self, cmd_type, args, dependencies=None):
|
|
|
self.cmd_type = cmd_type
|
|
|
self.args = args
|
|
|
self.dependencies = dependencies or []
|
|
|
self.completed = threading.Event()
|
|
|
|
|
|
class CommandQueue:
|
|
|
def __init__(self, num_chips, num_sms):
|
|
|
self.queue = queue.Queue()
|
|
|
self.num_chips = num_chips
|
|
|
self.num_sms = num_sms
|
|
|
self.lock = threading.Lock()
|
|
|
self.chip_states = [None] * num_chips
|
|
|
self.sm_states = [[None]*num_sms for _ in range(num_chips)]
|
|
|
|
|
|
def enqueue(self, command):
|
|
|
self.queue.put(command)
|
|
|
|
|
|
def dispatch(self):
|
|
|
|
|
|
while not self.queue.empty():
|
|
|
cmd = self.queue.get()
|
|
|
|
|
|
cmd.completed.set()
|
|
|
|
|
|
def wait_for_all(self):
|
|
|
|
|
|
while not self.queue.empty():
|
|
|
cmd = self.queue.get()
|
|
|
cmd.completed.wait()
|
|
|
|