src/pqc_gpu_driver/backends/memory.py
1.7 KB · 52 lines · python Raw
1 """In-memory backend - reference implementation for tests and demos."""
2
3 from __future__ import annotations
4
5 import uuid
6
7 from pqc_gpu_driver.backends.base import GPUBackend
8 from pqc_gpu_driver.errors import BackendError
9 from pqc_gpu_driver.tensor import EncryptedTensor
10
11
12 class InMemoryBackend(GPUBackend):
13 """Deterministic in-memory backend.
14
15 Stores EncryptedTensor bundles in a dict keyed by a synthetic device handle.
16 Suitable for tests, tutorials, and CI - has no dependency on any GPU runtime.
17 The bytes stay encrypted; the backend never peeks inside the ciphertext.
18 """
19
20 name = "in-memory"
21 device_type = "in-memory"
22
23 def __init__(self, device_label: str = "simulated-gpu-0") -> None:
24 self.device_label = device_label
25 self._store: dict[str, EncryptedTensor] = {}
26
27 def upload(self, tensor: EncryptedTensor) -> str:
28 handle = f"mem:{uuid.uuid4().hex}"
29 self._store[handle] = tensor
30 return handle
31
32 def download(self, device_handle: str) -> EncryptedTensor:
33 if device_handle not in self._store:
34 raise BackendError(f"unknown device handle {device_handle}")
35 return self._store[device_handle]
36
37 def free(self, device_handle: str) -> None:
38 if device_handle not in self._store:
39 raise BackendError(f"unknown device handle {device_handle}")
40 del self._store[device_handle]
41
42 def device_info(self) -> dict:
43 return {
44 "name": self.device_label,
45 "device_type": self.device_type,
46 "compute_capability": "n/a",
47 "memory_bytes": sum(
48 len(t.ciphertext) // 2 for t in self._store.values()
49 ),
50 "live_handles": len(self._store),
51 }
52