使用金属性能着色器生成随机数据

我正试图使用MPSMatrixRandom为我的应用程序用GPU生成一些随机整数数据,我有两个问题:MPSMatrixRandomMTGP32和MPSMatrixRandomPhilox有什么区别?

  1. MPSMatrixRandomMTGP32和MPSMatrixRandomPhilox之间有什么区别?

    我知道这两个着色器使用了不同的算法,但它们之间有什么区别?这两种算法的性能或输出是否有差异,如果有,如何差异?

  2. 你可以用什么代码来实现这些着色器?

    我试着自己实现它们,但我的应用总是以模糊的错误信息崩溃。我希望看到一个正确实现的例子。

解决方案:

这是一个演示如何使用这两个内核生成随机矩阵的示例。

import Foundation
import Metal
import MetalPerformanceShaders

let device = MTLCreateSystemDefaultDevice()!
let commandQueue = device.makeCommandQueue()!

let rows = 8
let columns = 8
let matrixDescriptor = MPSMatrixDescriptor(rows: rows,
                                           columns: columns,
                                           rowBytes: MemoryLayout<Float>.stride * columns,
                                           dataType: .float32)
let mtMatrix = MPSMatrix(device: device, descriptor: matrixDescriptor)

let phMatrix = MPSMatrix(device: device, descriptor: matrixDescriptor)

let distribution = MPSMatrixRandomDistributionDescriptor.uniformDistributionDescriptor(withMinimum: -1.0, maximum: 1.0)

let mtKernel = MPSMatrixRandomMTGP32(device: device,
                                     destinationDataType: .float32,
                                     seed: 0,
                                     distributionDescriptor: distribution)

let phKernel = MPSMatrixRandomPhilox(device: device,
                                     destinationDataType: .float32,
                                     seed: 0,
                                     distributionDescriptor: distribution)


let commandBuffer = commandQueue.makeCommandBuffer()!
mtKernel.encode(commandBuffer: commandBuffer, destinationMatrix: mtMatrix)
phKernel.encode(commandBuffer: commandBuffer, destinationMatrix: phMatrix)
#if os(macOS)
mtMatrix.synchronize(on: commandBuffer)
phMatrix.synchronize(on: commandBuffer)
#endif
commandBuffer.commit()

commandBuffer.waitUntilCompleted() // Only necessary to ensure GPU->CPU sync for display

print("Mersenne Twister values:")
let mtValues = mtMatrix.data.contents().assumingMemoryBound(to: Float.self)
for row in 0..<rows {
    for col in 0..<columns {
        print("\(mtValues[row * columns + col])", terminator: " ")
    }
    print("")
}
print("")

print("Philox values:")
let phValues = phMatrix.data.contents().assumingMemoryBound(to: Float.self)
for row in 0..<rows {
    for col in 0..<columns {
        print("\(phValues[row * columns + col])", terminator: " ")
    }
    print("")
}

我不能评论这些生成器的统计特性,我会让你参考评论中提到的论文。

给TA打赏
共{{data.count}}人
人已打赏
未分类

在大查询中创建表

2022-9-8 16:30:35

未分类

Gitlab EE 12.8.5-ee 终极版禁用了Gitlab pull mirror选项。

2022-9-8 16:30:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索