Commit f107a71
authored
feat(compute): Extract OpenCL compute infrastructure from ART (#3)
* feat: add PM infrastructure and beads for OpenCL extraction
- Add .pm/ project management infrastructure
- CONTINUATION.md for session resumption
- METHODOLOGY.md for TDD workflow
- CONTEXT_PROTOCOL.md for agent handoffs
- Add .beads/ for issue tracking with beads
- Add AGENTS.md with bd commands reference
- Create bead hierarchy for 4-phase OpenCL extraction:
- Phase 1: Core interfaces (GPUBuffer, ComputeKernel)
- Phase 2: OpenCL implementation
- Phase 3: Utilities and stubs
- Phase 4: ART migration
Plan v2 audited and approved (92% confidence GO).
See ChromaDB: plan::gpu-support::art-opencl-extraction::v2
* feat(compute): Phase 1 - extract core compute interfaces from ART
Extract portable compute API layer (Layer 2 per architecture decision):
- GPUBuffer: Host-device memory transfer interface
- ComputeKernel: Unified kernel compilation/execution interface
- BufferAccess enum for kernel argument modes
- KernelCompilationException, KernelExecutionException
- GPUBackend: Enum for METAL, OPENCL, CPU_FALLBACK with priorities
- GPUErrorClassifier: Programming vs recoverable error classification
- OpenCL error code extraction from exception messages
- Fixed self-referencing cause infinite loop (improvement over ART)
All interfaces are backend-agnostic. OpenCL implementations (Layer 3)
will wrap existing CLKernelHandle/CLBufferHandle (Layer 1) in Phase 2.
Beads closed: e63, ad2, kdp, ipz, 6e9
See: plan::gpu-support::art-opencl-extraction::v2
* Phase 2 progress: OpenCLContext, OpenCLBuffer, GPUBackend.isAvailable()
- Extract OpenCLContext singleton with reference counting and testReset()
- Extract OpenCLBuffer implementing GPUBuffer interface
- Add GPUBackend.isAvailable() with cached Metal/OpenCL detection
- Remove CL.create() calls to avoid macOS SIGSEGV in forked JVMs
- Add dual property name support (gpu.disable, luciferase.gpu.disable)
Beads: gij, 9go closed; ilr in progress
Note: OpenCLBufferTest has macOS driver crash - needs debugging
* Fix OpenCLBufferTest SIGSEGV crash on macOS
Replace JUnit Assumptions.assumeTrue() pattern with simple early-return
checks in each test method. The Assumptions pattern caused OpenCL driver
state issues in Maven Surefire forked JVM processes.
- Simplified @BeforeAll to just detect OpenCL availability
- Use `if (!openCLAvailable) return;` instead of @beforeeach assumptions
- Fix IndexOutOfBounds in FloatBuffer test (remove unnecessary flip())
- All 10 OpenCLBuffer tests pass
Closes: gpu-support-ilr
* feat(compute): Extract OpenCLKernel from ART
Implement OpenCLKernel as ComputeKernel interface for GPU compute:
- Kernel compilation with build log on failure
- Buffer, float, int, and local memory argument binding
- 1D/2D/3D execution with optional local work sizes
- Async execution with event-based synchronization
- Uses OpenCLContext singleton pattern
16 tests covering:
- Compilation lifecycle (compile, double-compile, invalid source)
- Argument setting (buffer, scalar, before compile)
- Execution (vectorAdd, scale, 2D/3D work sizes)
- Resource lifecycle (close, double-close, ops after close)
Closes: gpu-support-6pw
* feat(compute): Extract BackendSelector with dual env var support
Automatic GPU backend selection with priority-based fallback:
- Metal (priority 100, macOS only)
- OpenCL (priority 90, cross-platform)
- CPU fallback (priority 10, always available)
Environment variable support:
- GPU_BACKEND / GPU_DISABLE (new generic names)
- ART_GPU_BACKEND / ART_GPU_DISABLE (legacy, deprecated)
CI environment auto-detection (GitHub Actions, Jenkins, etc).
17 tests covering selection logic, caching, and environment info.
Closes: gpu-support-cbr
* test(compute): Add Phase 2 integration tests
Full compute workflow tests:
- vectorAdd: context → buffers → kernel → execute → read
- SAXPY: scalar float arguments (result = a*x + y)
- 2D execution: proper 2D kernel indexing
- Large data: 64K elements
- Multiple executions: iterative kernel runs
- Resource cleanup: try-with-resources pattern
9 integration tests verifying complete OpenCL compute pipeline.
Closes: gpu-support-97u
* Close Phase 2 feature bead (5wc)
* feat(compute): Add KernelLoader with path conventions
Kernel loading utility with caching and convention support:
- loadOpenCLKernel(name) → kernels/opencl/{name}.cl
- loadMetalKernel(name) → kernels/metal/{name}.metal
- loadTestKernel(name) → kernels/{name}.cl (flat structure)
- ConcurrentHashMap caching for repeated loads
- kernelExists() for resource checking
Package documentation with usage examples and conventions.
12 tests covering loading, caching, and error handling.
Closes: gpu-support-0y1
* Close extraction epic (bsy) - gpu-support extraction complete
* fix: Add .pm/ to gitignore and remove from tracking
* feat(compute): add high-level ComputeService API with example kernels
Add ComputeService facade providing simplified GPU compute with automatic
CPU fallback. Includes built-in operations for vector math (vectorAdd,
saxpy, scale) and reductions (sum, min, max), plus custom operation
support via createOperation().
New resources:
- kernels/opencl/vector_add.cl - element-wise vector addition
- kernels/opencl/saxpy.cl - SAXPY operations
- kernels/opencl/reduce.cl - parallel sum/min/max reductions
- kernels/opencl/transform.cl - scale, clamp, abs, square, sqrt
Tests:
- ComputeServiceTest: 16 tests demonstrating API usage
- ComputeServiceStressTest: 23 tests for edge cases, large arrays,
concurrent access, and memory pressure
Total: 302 tests pass in resource module
* docs(compute): add usage guide and runnable examples
COMPUTE.md covers:
- Basic operations (vectorAdd, saxpy, scale, sum, min, max)
- Custom kernel writing
- Low-level API usage
- Configuration (env vars, backend selection)
- Error handling
- Performance notes
- Thread safety
Examples in examples/ package:
- VectorMathExample: built-in operations
- CustomKernelExample: writing custom kernels
- PerformanceExample: GPU vs CPU timing
- LowLevelExample: direct buffer/kernel control
* docs: add GPU compute section to root README
* fix(gpu-test): correct kernel argument passing in SimpleMatrixMultiplyTest
Bug: stack.ints(N) allocates N zero-filled ints, not an int containing N.
The kernel received size=0, producing all zeros.
Fix: Use clSetKernelArg1i/clSetKernelArg1p for scalar and pointer args.
* docs: add GPU compute API reference to AGENTS.md for AI discovery1 parent 359282c commit f107a71
File tree
45 files changed
+7319
-4
lines changed- .beads
- gpu-test-framework/src/test/java/com/hellblazer/gpu/test/examples
- resource
- src
- main
- java/com/hellblazer/luciferase/resource/compute
- opencl
- resources/kernels/opencl
- test
- java/com/hellblazer/luciferase/resource/compute
- examples
- opencl
- resources/kernels
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
45 files changed
+7319
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 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 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 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 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 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 | + | |
0 commit comments