Go to file
Alejandro Isaza f5f2289398 Remove file names from header comments
Also add the license to a couple files that were missing it and include
the readme, license and Package.swift in the Xcode project for
convenience.
2017-09-18 21:52:32 -07:00
Source Remove file names from header comments 2017-09-18 21:52:32 -07:00
Supporting Files Converted project to Swift 2.0 2015-12-04 15:57:07 -06:00
Surge.playground Fix errors and warnings in Xcode 9 2017-09-18 21:16:58 -07:00
Surge.xcodeproj Remove file names from header comments 2017-09-18 21:52:32 -07:00
Surge.xcworkspace Update .gitignore and remove user-specific files 2017-09-18 21:34:22 -07:00
Tests Remove file names from header comments 2017-09-18 21:52:32 -07:00
.gitignore Update .gitignore and remove user-specific files 2017-09-18 21:34:22 -07:00
.travis.yml Move tests to conform to SPM file layout 2017-09-18 21:22:05 -07:00
Cartfile Added a Cartfile for Carthage support 2016-02-14 20:38:27 -06:00
Cartfile.resolved Added a Cartfile for Carthage support 2016-02-14 20:38:27 -06:00
LICENSE Initial Commit 2014-08-23 23:02:33 -07:00
Package.swift Added Swift Package Manager support 2016-02-20 22:01:16 -06:00
README.md Fixed typographical error, changed auxilliary to auxiliary in README. 2017-09-18 21:46:41 -07:00
Surge.podspec Updated podspec to version 1.0.0 2016-01-08 15:15:50 +02:00

README.md

Surge Build Status GitHub license

Surge is a Swift library that uses the Accelerate framework to provide high-performance functions for matrix math, digital signal processing, and image manipulation.

Accelerate exposes SIMD instructions available in modern CPUs to significantly improve performance of certain calculations. Because of its relative obscurity and inconvenient APIs, Accelerate is not commonly used by developers, which is a shame, since many applications could benefit from these performance optimizations.

Surge aims to bring Accelerate to the mainstream, making it as easy (and nearly as fast, in most cases) to perform computation over a set of numbers as for a single member.

Though, keep in mind: Accelerate is not a silver bullet. Under certain conditions, such as performing simple calculations over a small data set, Accelerate can be out-performed by conventional algorithms. Always benchmark to determine the performance characteristics of each potential approach.


Curious about the name Surge? Back in the mid 90's, Apple, IBM, and Motorola teamed up to create AltiVec (a.k.a the Velocity Engine), which provided a SIMD instruction set for the PowerPC architecture. When Apple made the switch to Intel CPUs, AltiVec was ported to the x86 architecture and rechristened Accelerate. The derivative of Accelerate (and second derivative of Velocity) is known as either jerk, jolt, surge, or lurch, hence the name of this library.


Performance

Initial benchmarks on iOS devices and the iOS simulator indicate significant performance improvements over a conventional Swift implementation.

import Surge

let numbers: [Double] = ...
var sum: Double = 0.0

// Naïve Swift Implementation
sum = reduce(numbers, 0.0, +)

// Surge Implementation
sum = Surge.sum(numbers)

(Time in milliseconds, Optimization Level -Ofast)

n Swift Surge Δ
100 0.269081 0.004453 ~60x
100000 251.037254 0.028687 ~9000x
100000000 239474.689326 57.009841 ~4000x

Surge's performance characteristics have not yet been thoroughly evaluated, though initial benchmarks show incredible promise. Further investigation is definitely warranted.

Installation

The infrastructure and best practices for distributing Swift libraries are currently in flux during this beta period of Swift & Xcode. In the meantime, you can add Surge as a git submodule, drag the Surge.xcodeproj file into your Xcode project, and add Surge.framework as a dependency for your target.


Inventory

Surge functions are named according to their corresponding "Math.h" functions, where applicable (omitting f and d affixes, since type information is communicated and enforced by the language's type system).

Arithmetic

  • sum
  • asum
  • max
  • min
  • mean
  • meamg
  • measq
  • add
  • sub
  • mul
  • div
  • mod
  • remainder
  • sqrt

Auxiliary

  • abs
  • ceil
  • copysign
  • floor
  • rec
  • round
  • trunc

Convolution

  • conv
  • xcorr

Exponential

  • exp
  • exp2
  • log
  • log2
  • log10
  • logb

FFT

  • fft

Hyperbolic

  • sinh
  • cosh
  • tanh
  • asinh
  • acosh
  • atanh

Matrix

  • add
  • mul
  • inv
  • transpose

Power

  • pow

Trigonometric

  • sincos
  • sin
  • cos
  • tan
  • asin
  • acos
  • atan
  • rad2deg
  • deg2rad

Usage

Computing Sum of [Double]

import Surge

let n = [1.0, 2.0, 3.0, 4.0, 5.0]
let sum = Surge.sum(n) // 15.0

Computing Product of Two [Double]s

import Surge

let a = [1.0, 3.0, 5.0, 7.0]
let b = [2.0, 4.0, 6.0, 8.0]

let product = Surge.mul(a, b) // [2.0, 12.0, 30.0, 56.0]

License

Surge is available under the MIT license. See the LICENSE file for more info.