对于我的项目(正在编译为框架),我有一个名为 ops.metal
的文件:
kernel void add(device float *lhs [[buffer(0)]],
device float *rhs [[buffer(1)]],
device float *result [[buffer(2)]],
uint id [[ thread_position_in_grid ]])
{
result[id] = lhs[id] + rhs[id];
}
以下是 Swift 代码:
@available(OSX 10.11, *)
public class MTLContext {
var device: MTLDevice!
var commandQueue:MTLCommandQueue!
var library:MTLLibrary!
var commandBuffer:MTLCommandBuffer
var commandEncoder:MTLComputeCommandEncoder
init() {
if let defaultDevice = MTLCreateSystemDefaultDevice() {
device = defaultDevice
print("device created")
} else {
print("Metal is not supported")
}
commandQueue = device.makeCommandQueue()
library = device.newDefaultLibrary()
if let defaultLibrary = device.newDefaultLibrary() {
library = defaultLibrary
} else {
print("could not load default library")
}
commandBuffer = commandQueue.makeCommandBuffer()
commandEncoder = commandBuffer.makeComputeCommandEncoder()
}
deinit {
commandEncoder.endEncoding()
}
}
当我在单元测试中尝试创建
MTLContext
实例时,设备已经被创建,但是默认库无法创建("could not load default library
")。我已经检查编译后的框架在Resources
中是否有default.metallib
文件(这是使用newDefaultLibrary
最常见的原因)。不幸的是,我还没有找到任何能够在Metal着色器文件中创建计算
kernel
的工作示例(虽然有一些使用性能着色器的示例,但它们不需要在着色器文件中制作内核)。如果您有任何建议,将不胜感激!