金属内核的不同性能测量

Varying performance measurements for Metal kernel

我正在尝试使用 Metal 进行计算并测量我的一些内核的性能。这是我用来测量的东西:

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 函数本身除了使用计算命令编码器将命令编码到缓冲区外什么都不做。如果重要,dataBufferStorageModeShared 中。

我得到的性能结果为 [0.015457, 0.004573, 0.005718, 0.006153, 0.005495, 0.005555, 0.006460, 0.005946, 0.006363, 0.007379]。鉴于每次都执行相同的任务,我看不出第一次测量值如此之高的原因。

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

我很确定您的基准测试中发生了两件事:

  • 第一次测量的长度大约是其余测量的三倍。这种情况发生在很多基准测试中,通常是因为 CPU 需要预热才能发挥其全部功能,也可能是一些初始任务仅在您首次调用某个函数时执行(延迟执行)。很明显它只影响第一个,所以你真的不必费心
  • 所有测量值都存在大约 ~20% 的波动。我相信这是由于从 CPU 到 GPU 的连接:它们(相对)较远并且不在同一级别上运行,这意味着可能存在一些不一致。你不应该担心这个,因为你测量的标准偏差不是很高。

结论:您的性能测量完全没问题

也许您也可以将其更改为在提交后开始测量,看看它做了什么