Skip to main content

Swift Generic Functions

0 likes • Oct 15, 2022 • 0 views
Swift
Loading...

More Swift Posts

Single Instruction Multiple Data

0 likes • Jan 28, 2023 • 1 view
Swift
import simd
private func test() {
let screenWidth: Int = 256
let screenHeight: Int = 240
let pixelBufferPtr = UnsafeMutableBufferPointer<BGRA>.allocate(capacity: screenWidth * screenHeight)
let runCount = 1000
let start = Date.now
for _ in 0 ..< runCount {
var index = 0
var palletIndex = 0
let palletCount = BGRAPallet.count
while index < pixelBufferPtr.count {
let bgra = BGRAPallet[palletIndex]
let bgraVector = simd_uint4(bgra.blue, bgra.green, bgra.red, bgra.alpha)
let maxCount = min(pixelBufferPtr.count - index, 4)
let pixelBuffer = pixelBufferPtr.baseAddress! + index
pixelBuffer.storeBytes(of: bgraVector, as: simd_uint4.self)
palletIndex += 1
if palletIndex == palletCount {
palletIndex = 0
}
index += maxCount
}
}
let elapsed = Date.now.timeIntervalSince(start)
print("Average time per run: \((Int(elapsed) * 1000) / runCount) ms")
}
//if for some reason your system doesnt support simd_uint4, you can try the following:
// private func test() {
// let screenWidth: Int = 256
// let screenHeight: Int = 240
// let pixelBufferPtr = UnsafeMutableBufferPointer<BGRA>.allocate(capacity: screenWidth * screenHeight)
// let runCount = 1000
// let start = Date.now
// for _ in 0 ..< runCount {
// let pixelBuffer = pixelBufferPtr.baseAddress!
// let pixelBufferCount = pixelBufferPtr.count
// let palletCount = BGRAPallet.count
// var palletIndex = 0
// for i in stride(from: 0, to: pixelBufferCount, by: 4) {
// let bgra = BGRAPallet[palletIndex]
// pixelBuffer[i] = bgra
// pixelBuffer[i + 1] = bgra
// pixelBuffer[i + 2] = bgra
// pixelBuffer[i + 3] = bgra
// palletIndex += 1
// if palletIndex == palletCount {
// palletIndex = 0
// }
// }
// }
// let elapsed = Date.now.timeIntervalSince(start)
// print("Average time per run: \((Int(elapsed) * 1000) / runCount) ms")
// }