// Radix2CooleyTukey benchmark // // Originally written by @owensd. Used with his permission. #if canImport(Glibc) import Glibc #elseif canImport(Musl) import Musl #elseif os(Windows) import MSVCRT #else import Darwin #endif import TestsUtils public let benchmarks = [ BenchmarkInfo( name: "Radix2CooleyTukey", runFunction: run_Radix2CooleyTukey, tags: [.validation, .algorithm], setUpFunction: setUpRadix2CooleyTukey, tearDownFunction: tearDownRadix2CooleyTukey, legacyFactor: 48), BenchmarkInfo( name: "Radix2CooleyTukeyf", runFunction: run_Radix2CooleyTukeyf, tags: [.validation, .algorithm], setUpFunction: setUpRadix2CooleyTukeyf, tearDownFunction: tearDownRadix2CooleyTukeyf, legacyFactor: 48), ] //===----------------------------------------------------------------------===// // Double Benchmark //===----------------------------------------------------------------------===// var double_input_real: UnsafeMutablePointer? var double_input_imag: UnsafeMutablePointer? var double_output_real: UnsafeMutablePointer? var double_output_imag: UnsafeMutablePointer? var double_temp_real: UnsafeMutablePointer? var double_temp_imag: UnsafeMutablePointer? let doubleN = 2_048 let doubleSize = { MemoryLayout.size * doubleN }() func setUpRadix2CooleyTukey() { let size = doubleSize double_input_real = UnsafeMutablePointer.allocate(capacity: size) double_input_imag = UnsafeMutablePointer.allocate(capacity: size) double_output_real = UnsafeMutablePointer.allocate(capacity: size) double_output_imag = UnsafeMutablePointer.allocate(capacity: size) double_temp_real = UnsafeMutablePointer.allocate(capacity: size) double_temp_imag = UnsafeMutablePointer.allocate(capacity: size) } func tearDownRadix2CooleyTukey() { double_input_real?.deallocate() double_input_imag?.deallocate() double_output_real?.deallocate() double_output_imag?.deallocate() double_temp_real?.deallocate() double_temp_imag?.deallocate() } func radix2CooleyTukey(_ level: Int, input_real: UnsafeMutablePointer, input_imag: UnsafeMutablePointer, stride: Int, output_real: UnsafeMutablePointer, output_imag: UnsafeMutablePointer, temp_real: UnsafeMutablePointer, temp_imag: UnsafeMutablePointer) { if level == 0 { output_real[0] = input_real[0]; output_imag[0] = input_imag[0]; return } let length = 1 << level let half = length >> 1 radix2CooleyTukey(level - 1, input_real: input_real, input_imag: input_imag, stride: stride << 1, output_real: temp_real, output_imag: temp_imag, temp_real: output_real, temp_imag: output_imag) radix2CooleyTukey(level - 1, input_real: input_real + stride, input_imag: input_imag + stride, stride: stride << 1, output_real: temp_real + half, output_imag: temp_imag + half, temp_real: output_real + half, temp_imag: output_imag + half) for idx in 0...size * floatN }() var float_input_real: UnsafeMutablePointer? var float_input_imag: UnsafeMutablePointer? var float_output_real: UnsafeMutablePointer? var float_output_imag: UnsafeMutablePointer? var float_temp_real: UnsafeMutablePointer? var float_temp_imag: UnsafeMutablePointer? func setUpRadix2CooleyTukeyf() { let size = floatSize float_input_real = UnsafeMutablePointer.allocate(capacity: size) float_input_imag = UnsafeMutablePointer.allocate(capacity: size) float_output_real = UnsafeMutablePointer.allocate(capacity: size) float_output_imag = UnsafeMutablePointer.allocate(capacity: size) float_temp_real = UnsafeMutablePointer.allocate(capacity: size) float_temp_imag = UnsafeMutablePointer.allocate(capacity: size) } func tearDownRadix2CooleyTukeyf() { float_input_real?.deallocate() float_input_imag?.deallocate() float_output_real?.deallocate() float_output_imag?.deallocate() float_temp_real?.deallocate() float_temp_imag?.deallocate() } func radix2CooleyTukeyf(_ level: Int, input_real: UnsafeMutablePointer, input_imag: UnsafeMutablePointer, stride: Int, output_real: UnsafeMutablePointer, output_imag: UnsafeMutablePointer, temp_real: UnsafeMutablePointer, temp_imag: UnsafeMutablePointer) { if level == 0 { output_real[0] = input_real[0]; output_imag[0] = input_imag[0]; return } let length = 1 << level let half = length >> 1 radix2CooleyTukeyf(level - 1, input_real: input_real, input_imag: input_imag, stride: stride << 1, output_real: temp_real, output_imag: temp_imag, temp_real: output_real, temp_imag: output_imag) radix2CooleyTukeyf(level - 1, input_real: input_real + stride, input_imag: input_imag + stride, stride: stride << 1, output_real: temp_real + half, output_imag: temp_imag + half, temp_real: output_real + half, temp_imag: output_imag + half) for idx in 0..