mandelbrot Swift #5 program
source code
/* The Computer Language Benchmarks Game
https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
direct transliteration of Greg Buchholz's C program
contributed by Isaac Gouy, fix by David Turnbull
dispatching to multiple cores by Patrick Stein
*/
#if os(Linux)
import Glibc
import Dispatch
#else
import Foundation
#endif
let width: Int = Int(CommandLine.arguments[1])!
let height = width
let iter = 50, limit = 2.0
print("P4\n\(width) \(height)")
let linesize = (width + (width % 8 != 0 ? 8 : 0 )) / 8
let dispatchGroup = DispatchGroup()
var outputbits:[UInt8] = [UInt8](repeating:0, count: linesize*height)
var counter = 0
var height_d = Double(height)
for y in 0..<height
{
var address = counter
counter += linesize
dispatchGroup.enter()
DispatchQueue.global().async
{
var Zr, Zi, Cr, Ci, Tr, Ti: Double
var byte_acc:UInt8 = 0
var bit_num = 0
Ci = 2.0*Double(y)/height_d - 1.0
let twodivwidth = 2.0 / Double(width)
for x in 0..<width
{
Zr = 0.0; Zi = 0.0; Tr = 0.0; Ti = 0.0
Cr = twodivwidth*Double(x) - 1.5;
var i = 0
while i < iter && (Tr+Ti <= limit*limit)
{
i += 1
Zi = 2.0*Zr*Zi + Ci
Zr = Tr - Ti + Cr
Tr = Zr * Zr
Ti = Zi * Zi
}
byte_acc <<= 1
if Tr+Ti <= limit*limit { byte_acc |= 0x01 }
bit_num += 1
if bit_num == 8 {
outputbits[address] = byte_acc
address += 1
byte_acc = 0
bit_num = 0
}
}
if bit_num != 0
{
byte_acc <<= (8-width%8)
outputbits[address] = byte_acc
}
dispatchGroup.leave()
}
}
dispatchGroup.wait()
counter = 0
for _ in 0..<height
{
for x in 0..<linesize
{
putc(Int32(outputbits[counter+x]),stdout)
}
counter += linesize
}
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
Swift version 5.8-dev
(LLVM 08f7fecaf6cedb8,
Swift 24fe6ae8532db5d)
Tue, 24 Jan 2023 05:56:57 GMT
MAKE:
/opt/src/swift-5.8-DEVELOPMENT-SNAPSHOT-2023-01-10-a-ubuntu22.04/usr/bin/swiftc mandelbrot.swift-5.swift -Ounchecked -o mandelbrot.swift-5.swift_run
13.02s to complete and log all make actions
COMMAND LINE:
./mandelbrot.swift-5.swift_run 16000
(BINARY) PROGRAM OUTPUT NOT SHOWN