要回答您的问题如何制作金属,您可以使用device atomic_int
.
本质上你创建了一个 IntMTLBuffer
并将其传递给您的内核并使用atomic_fetch_add_explicit
.
创建缓冲区一次:
var bristleCounter = 0
counterBuffer = device.makeBuffer(bytes: &bristleCounter, length: MemoryLayout<Int>.size, options: [.storageModeShared])
将计数器重置为 0 并绑定计数器缓冲区:
var z = 0
counterBuffer.contents().copyMemory(from: &z, byteCount: MemoryLayout<Int>.size)
kernelEncoder.setBuffer(counterBuffer, offset: 0, index: 0)
Kernel:
kernel void myKernel (device atomic_int *counter [[buffer(0)]]) {}
增加内核中的计数器(并获取值):
int newCounterValue = atomic_fetch_add_explicit(counter, 1, memory_order_relaxed);
获取CPU端的计数器:
kernelEncoder.endEncoding()
kernelBuffer.commit()
kernelBuffer.waitUntilCompleted()
//Counter from kernel now in counterBuffer
let bufPointer = counterBuffer.contents().load(as: Int.self)
print("Counter: \(bufPointer)")