|
|
import time |
|
|
|
|
|
class CommandProcessor: |
|
|
def __init__(self, hal, memory_manager): |
|
|
self.hal = hal |
|
|
self.memory_manager = memory_manager |
|
|
self.command_buffer = [] |
|
|
|
|
|
def add_command(self, command_type, **kwargs): |
|
|
command = { |
|
|
"type": command_type, |
|
|
"args": kwargs |
|
|
} |
|
|
self.command_buffer.append(command) |
|
|
print(f"Added command: {command_type} with args {kwargs}") |
|
|
|
|
|
def submit_commands(self, chip_id=0): |
|
|
if not self.hal.initialized: |
|
|
raise RuntimeError("HAL not initialized. Cannot submit commands.") |
|
|
|
|
|
print(f"Submitting {len(self.command_buffer)} commands to Chip {chip_id}...") |
|
|
results = [] |
|
|
for command in self.command_buffer: |
|
|
command_type = command["type"] |
|
|
args = command["args"] |
|
|
|
|
|
try: |
|
|
if command_type == "execute_kernel": |
|
|
sm_id = args.get("sm_id") |
|
|
a = args.get("a") |
|
|
b = args.get("b") |
|
|
cin = args.get("cin") |
|
|
opcode = args.get("opcode") |
|
|
reg_sel = args.get("reg_sel") |
|
|
|
|
|
try: |
|
|
v2_result = self.hal.v2_core_step(chip_id, a, b, cin, opcode, reg_sel) |
|
|
results.append(v2_result) |
|
|
print(f" [v2] Executed kernel on chip {chip_id} (AdvancedCore). Result: {v2_result}") |
|
|
except Exception as e: |
|
|
|
|
|
result = self.hal.execute_sm_warp(chip_id, sm_id, a, b, cin, opcode, reg_sel) |
|
|
results.append(result) |
|
|
print(f" Executed kernel on SM {sm_id}. Result: {result}") |
|
|
elif command_type == "matmul": |
|
|
sm_id = args.get("sm_id") |
|
|
A = args.get("A") |
|
|
B = args.get("B") |
|
|
|
|
|
try: |
|
|
v2_result = self.hal.v2_tensor_matmul(chip_id, A, B) |
|
|
results.append(v2_result) |
|
|
print(f" [v2] Executed tensor matmul on chip {chip_id}. Result: {v2_result}") |
|
|
except Exception as e: |
|
|
result = self.hal.execute_tensor_core_matmul(chip_id, sm_id, A, B) |
|
|
results.append(result) |
|
|
print(f" Executed matmul on SM {sm_id}. Result: {result}") |
|
|
elif command_type == "draw_arrays": |
|
|
|
|
|
print(f" [v2] draw_arrays command received (not yet fully simulated in v2 core).") |
|
|
results.append(None) |
|
|
elif command_type == "draw_indexed": |
|
|
print(f" [v2] draw_indexed command received (not yet fully simulated in v2 core).") |
|
|
results.append(None) |
|
|
elif command_type == "write_memory": |
|
|
virtual_address = args.get("virtual_address") |
|
|
data = args.get("data") |
|
|
self.memory_manager.write_data(virtual_address, data, chip_id) |
|
|
results.append(None) |
|
|
print(f" Wrote data to memory at virtual address {virtual_address}.") |
|
|
elif command_type == "read_memory": |
|
|
virtual_address = args.get("virtual_address") |
|
|
size_bytes = args.get("size_bytes") |
|
|
result = self.memory_manager.read_data(virtual_address, size_bytes, chip_id) |
|
|
results.append(result) |
|
|
print(f" Read data from memory at virtual address {virtual_address}. Data: {result}") |
|
|
elif command_type == "global_barrier": |
|
|
print(f" Executing global barrier on Chip {chip_id}. All pending operations on this chip will complete.") |
|
|
time.sleep(0.01) |
|
|
results.append(None) |
|
|
elif command_type == "shared_memory_barrier": |
|
|
sm_id = args.get("sm_id") |
|
|
print(f" Executing shared memory barrier on Chip {chip_id}, SM {sm_id}. All pending shared memory operations on this SM will complete.") |
|
|
time.sleep(0.001) |
|
|
results.append(None) |
|
|
elif command_type == "atomic_operation": |
|
|
sm_id = args.get("sm_id") |
|
|
address = args.get("address") |
|
|
operation = args.get("operation") |
|
|
value = args.get("value") |
|
|
print(f" Executing atomic operation '{operation}' at address {address} on Chip {chip_id}, SM {sm_id} with value {value}.") |
|
|
|
|
|
results.append(None) |
|
|
else: |
|
|
print(f" Unknown command type: {command_type}") |
|
|
results.append(None) |
|
|
except Exception as e: |
|
|
print(f"Error executing command {command_type}: {e}") |
|
|
results.append(f"Error: {e}") |
|
|
|
|
|
self.command_buffer = [] |
|
|
print("Command submission complete.") |
|
|
return results |
|
|
|
|
|
def clear_commands(self): |
|
|
self.command_buffer = [] |
|
|
print("Command buffer cleared.") |
|
|
|
|
|
|
|
|
|