为什么我得不到这个Metal内核的结果?

3

我正在尝试理解Metal计算着色器的工作原理,因此我编写了以下代码:

class AppDelegate: NSObject, NSApplicationDelegate {


    var number:Float!
    var buffer:MTLBuffer!


    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // Insert code here to initialize your application
        let metalDevice = MTLCreateSystemDefaultDevice()!
        let library = metalDevice.newDefaultLibrary()!
        let commandQueue = metalDevice.newCommandQueue()
        let commandBuffer = commandQueue.commandBuffer()
        let commandEncoder = commandBuffer.computeCommandEncoder()


        let pointlessFunction = library.newFunctionWithName("pointless")!
        let pipelineState = try! metalDevice.newComputePipelineStateWithFunction(pointlessFunction)
        commandEncoder.setComputePipelineState(pipelineState)
        number = 12

        buffer = metalDevice.newBufferWithBytes(&number, length: sizeof(Float), options: MTLResourceOptions.StorageModeShared)
        commandEncoder.setBuffer(buffer, offset: 0, atIndex: 0)


        commandEncoder.endEncoding()

        commandBuffer.commit()
        commandBuffer.waitUntilCompleted()

        let data = NSData(bytesNoCopy: buffer.contents(), length: sizeof(Float), freeWhenDone: false)
        var newResult:Float = 0
        data.getBytes(&newResult, length: sizeof(Float))
        print(newResult)




    }

通过使用StorageModeShared创建缓冲区,我希望在我的Swift代码中反映对Metal缓冲区所做的更改,但是当我填充newResult变量时,它看起来像缓冲区仍然是初始值(12),而不是应该是125:
#include <metal_stdlib>
using namespace metal;



kernel void pointless (device float* outData [[ buffer(0) ]]) {

    *outData = 125.0;
}

我做错了什么吗?
1个回答

1
核函数不会自动运行,除非你派遣它。我认为你假设如果有一个函数,那么Metal应该运行它一次,直到你说停止,但这不会发生。相反,它根本不会运行。在endEncoding之前添加这个,就可以了!
let size = MTLSize(width: 1, height: 1, depth: 1)
commandEncoder.dispatchThreadgroups(size, threadsPerThreadgroup: size)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接