Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Swift 金属内核的可变性能测量_Swift_Metal - Fatal编程技术网

Swift 金属内核的可变性能测量

Swift 金属内核的可变性能测量,swift,metal,Swift,Metal,我正在尝试用金属进行计算,并测量一些内核的性能。以下是我用来衡量的: self.measureMetrics(XCTestCase.defaultPerformanceMetrics(), automaticallyStartMeasuring: false) { do { let commandBuffer = device.newCommandQueue().commandBuffer() try reverse(library, commandBu

我正在尝试用金属进行计算,并测量一些内核的性能。以下是我用来衡量的:

self.measureMetrics(XCTestCase.defaultPerformanceMetrics(), automaticallyStartMeasuring: false) {
    do {
        let commandBuffer = device.newCommandQueue().commandBuffer()

        try reverse(library, commandBuffer: commandBuffer, dataBuffer: dataBuffer, bufferSize: uint(data.count), elementSize: uint(sizeof(Int)))

        self.startMeasuring()

        commandBuffer.commit()
        commandBuffer.waitUntilCompleted()

        self.stopMeasuring()
    } catch {
        print("Exception")
    }
}
reverse
函数本身只使用compute命令编码器将命令编码到缓冲区中。
dataBuffer
处于
StorageModeShared
状态(如果有必要)

我得到的性能结果是
[0.015457,0.004573,0.005718,0.006153,0.005495,0.005555,0.006460,0.005946,0.006363,0.007379]
。考虑到每次都执行相同的任务,我看不出为什么第一次测量值这么高


你知道为什么第一次测量的时间与其他测量的时间如此不同吗?

在你的基准测试中,有两件事我很确定:

  • 第一次测量的长度大约是其他测量的三倍。这种情况在很多基准测试中都会发生,通常是因为CPU在满负荷运行之前需要预热,也可能是一些初始任务,只有在您第一次调用某个函数时才会执行(延迟执行)。很明显,它只会影响第一个,所以你真的不必麻烦
  • 所有测量值都有大约20%的波动。我相信这是由于CPU和GPU之间的连接:它们(相对地)相距很远,并且不在同一级别上运行,这意味着可能存在一些不一致。你不必担心这一点,因为你测量的标准偏差不是很高
结论:您的性能测量完全正确


另外,您也可以更改它,在提交后开始测量,看看它能做什么

谢谢!在测量之前,我运行了几次来预热它,现在一切都好了……)