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之间的连接:它们(相对地)相距很远,并且不在同一级别上运行,这意味着可能存在一些不一致。你不必担心这一点,因为你测量的标准偏差不是很高
另外,您也可以更改它,在提交后开始测量,看看它能做什么谢谢!在测量之前,我运行了几次来预热它,现在一切都好了……)