#!/usr/bin/env swift import Foundation import Metal print("=== Test Metal Basic ===") print("Start time: \(Date())") fflush(stdout) do { // Try to create Metal device guard let device = MTLCreateSystemDefaultDevice() else { print("ERROR: Cannot create Metal device") exit(1) } print("Metal device: \(device.name)") fflush(stdout) guard let commandQueue = device.makeCommandQueue() else { print("ERROR: Cannot create command queue") exit(1) } print("Command queue created") fflush(stdout) // Try a simple compute operation let source = """ #include using namespace metal; kernel void simple_add(device const float* a [[buffer(0)]], device const float* b [[buffer(1)]], device float* result [[buffer(2)]], uint id [[thread_position_in_grid]]) { result[id] = a[id] + b[id]; } """ let library = try device.makeLibrary(source: source, options: nil) print("Library compiled") fflush(stdout) guard let function = library.makeFunction(name: "simple_add") else { print("ERROR: Cannot create function") exit(1) } print("Function created") fflush(stdout) let pipeline = try device.makeComputePipelineState(function: function) print("Pipeline created") fflush(stdout) // Create buffers let count = 1024 guard let bufferA = device.makeBuffer(length: count * MemoryLayout.stride), let bufferB = device.makeBuffer(length: count * MemoryLayout.stride), let bufferResult = device.makeBuffer(length: count * MemoryLayout.stride) else { print("ERROR: Cannot create buffers") exit(1) } // Fill buffers let ptrA = bufferA.contents().bindMemory(to: Float.self, capacity: count) let ptrB = bufferB.contents().bindMemory(to: Float.self, capacity: count) for i in 0..