gpt4 book ai didi

swift - 无法使用 Swift 在 Metal 中加载默认库

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:11 25 4
gpt4 key购买 nike

对于我的项目(被编译为一个框架)我有一个文件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 的实例时,设备已创建,但无法创建默认库(“无法加载默认库 ”)。我检查了编译框架在 Resources 中是否有一个 default.metallib(这是为 newDefaultLibrary 给出的最常见原因)。

不幸的是,我无法找到任何在 Metal 着色器文件中创建计算 kernel 的工作示例(有一些使用性能着色器的示例,但它们不需要在着色器文件中制作内核)。

如有任何建议,我们将不胜感激!

最佳答案

newDefaultLibrary() 从当前运行的应用程序的 main 包加载。它不会在任何嵌入式框架或其他位置搜索库。

如果你想使用编译到嵌入式框架中的 metallib,最简单的做法是获取对其包含的 Bundle 的引用,并改为请求该包的默认库:

let frameworkBundle = Bundle(for: SomeClassFromMyShaderFramework.self)
guard let defaultLibrary = try? device.makeDefaultLibrary(bundle: frameworkBundle) else {
fatalError("Could not load default library from specified bundle")
}

这确实要求您在包含着色器的框架中至少有一个公开可见的类,但这可以像严格声明一个空类一样简单,以便进行捆绑查找:

public class SomeClassFromMyShaderFramework {}

关于swift - 无法使用 Swift 在 Metal 中加载默认库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43368984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com