import XCTest @testable import MarkBase final class BatchKernelTest: XCTestCase { func testBatchKernelCompilation() throws { print("\n═══════════════════════════════════════════════════════════════════") print(" Batch Metal Kernel Compilation Test") print("═══════════════════════════════════════════════════════════════════\n") let engine = try MarkBaseEngine(autoCompile: true) // Test batch kernel compilation print("Testing batch kernel compilation...") do { let pso1 = try engine.pipeline(named: "quantized_matmul_batch") print(" ✓ quantized_matmul_batch: compiled") print(" Threadgroup size: \(pso1.maxTotalThreadsPerThreadgroup)") } catch { print(" ✗ quantized_matmul_batch: NOT FOUND") print(" Error: \(error)") } do { let pso2 = try engine.pipeline(named: "rms_norm_batch") print(" ✓ rms_norm_batch: compiled") print(" Threadgroup size: \(pso2.maxTotalThreadsPerThreadgroup)") } catch { print(" ✗ rms_norm_batch: NOT FOUND") print(" Error: \(error)") } do { let pso3 = try engine.pipeline(named: "sliding_attention_batch") print(" ✓ sliding_attention_batch: compiled") print(" Threadgroup size: \(pso3.maxTotalThreadsPerThreadgroup)") } catch { print(" ✗ sliding_attention_batch: NOT FOUND") print(" Error: \(error)") } print("\n═══════════════════════════════════════════════════════════════════") print("Batch kernel compilation test complete") print("═══════════════════════════════════════════════════════════════════\n") } func testBatchMatmulSimple() throws { print("\n═══════════════════════════════════════════════════════════════════") print(" Simple Batch Matmul Test") print("═══════════════════════════════════════════════════════════════════\n") let engine = try MarkBaseEngine(autoCompile: true) let device = engine.device // Create simple test data let batchSize = 2 let inDim = 256 let outDim = 512 // Input: [2, 256] let inputs = device.makeBuffer(length: batchSize * inDim * 4)! let inputPtr = inputs.contents().assumingMemoryBound(to: Float.self) for i in 0..