【问题标题】:Varying performance measurements for Metal kernel金属内核的不同性能测量
【发布时间】:2015-08-27 18:21:56
【问题描述】:

我正在尝试使用 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]。鉴于每次都执行相同的任务,我看不出第一次测量值如此之高的原因。

任何想法为什么第一次测量所用的时间与其他时间如此不同?

【问题讨论】:

    标签: swift metal


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!我在测量之前运行了几次以预热它,现在一切正常...... :)
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2021-12-19
    相关资源
    最近更新 更多