Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift2 为什么不';我不能得到这个金属内核的结果吗_Swift2_Xcode7_Metal - Fatal编程技术网

Swift2 为什么不';我不能得到这个金属内核的结果吗

Swift2 为什么不';我不能得到这个金属内核的结果吗,swift2,xcode7,metal,Swift2,Xcode7,Metal,我试图了解金属计算着色器是如何工作的,因此我编写了以下代码: class AppDelegate: NSObject, NSApplicationDelegate { var number:Float! var buffer:MTLBuffer! func applicationDidFinishLaunching(aNotification: NSNotification) { // Insert code here to initialize

我试图了解金属计算着色器是如何工作的,因此我编写了以下代码:

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代码中,但是当我填充
newResult
变量时,看起来缓冲区的值仍然与开始时(12)的值相同,而它应该是125:

#include <metal_stdlib>
using namespace metal;



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

    *outData = 125.0;
}
#包括
使用金属;
内核无效无意义(设备浮点*outData[[buffer(0)]){
*outData=125.0;
}

我做错了什么?

除非分派内核函数,否则它不会运行。我想你们是在假设,若你们有一个函数,那个么金属应该运行它一次,直到你们说不是,但这不会发生。相反,它根本不会运行。在
endEncoding
之前添加此项,您就可以开始了

let size = MTLSize(width: 1, height: 1, depth: 1)
commandEncoder.dispatchThreadgroups(size, threadsPerThreadgroup: size)