Parallel spectral-norm shootout benchmark.
This commit is contained in:
parent
2d3a713f0d
commit
d279593c15
|
@ -0,0 +1,61 @@
|
||||||
|
#lang racket/base
|
||||||
|
;; The Computer Language Benchmarks Game
|
||||||
|
;; http://shootout.alioth.debian.org/
|
||||||
|
;; Translated from Mike Pall's Lua version.
|
||||||
|
;; Parallelized by Sam Tobin-Hochstadt
|
||||||
|
|
||||||
|
(require racket/cmdline racket/future
|
||||||
|
racket/require (for-syntax racket/base)
|
||||||
|
(filtered-in (λ (name) (regexp-replace #rx"unsafe-" name ""))
|
||||||
|
racket/unsafe/ops)
|
||||||
|
(only-in racket/flonum make-flvector))
|
||||||
|
|
||||||
|
(define-syntax-rule (for/par k ([i N]) b)
|
||||||
|
(let ([stride (fxquotient N k)])
|
||||||
|
(define fs
|
||||||
|
(for/list ([n k])
|
||||||
|
(future (λ () (for ([i (in-range (fx* n stride) (fxmin N (fx* (fx+ n 1) stride)))]) b)))))
|
||||||
|
(for-each touch fs)))
|
||||||
|
|
||||||
|
|
||||||
|
;; the big let improves performance by about 20%
|
||||||
|
(let* ()
|
||||||
|
(define N (command-line #:args (n) (string->number n)))
|
||||||
|
(define C (processor-count))
|
||||||
|
(define (A i j)
|
||||||
|
(let ([ij (fx+ i j)])
|
||||||
|
(fl/ 1.0 (fl+ (fl* (fl* (fx->fl ij)
|
||||||
|
(fx->fl (fx+ ij 1)))
|
||||||
|
0.5)
|
||||||
|
(fx->fl (fx+ i 1))))))
|
||||||
|
(define (Av x y N)
|
||||||
|
(for/par C ([i N])
|
||||||
|
(flvector-set!
|
||||||
|
y i
|
||||||
|
(let L ([a 0.0] [j 0])
|
||||||
|
(if (fx= j N) a
|
||||||
|
(L (fl+ a (fl* (flvector-ref x j) (A i j)))
|
||||||
|
(fx+ j 1)))))))
|
||||||
|
(define (Atv x y N)
|
||||||
|
(for/par C ([i N])
|
||||||
|
(flvector-set!
|
||||||
|
y i
|
||||||
|
(let L ([a 0.0] [j 0])
|
||||||
|
(if (fx= j N) a
|
||||||
|
(L (fl+ a (fl* (flvector-ref x j) (A j i)))
|
||||||
|
(fx+ j 1)))))))
|
||||||
|
(define (AtAv x y t N) (Av x t N) (Atv t y N))
|
||||||
|
(define u (make-flvector N 1.0))
|
||||||
|
(define v (make-flvector N))
|
||||||
|
(define t (make-flvector N))
|
||||||
|
(for ([i (in-range 10)])
|
||||||
|
(AtAv u v t N) (AtAv v u t N))
|
||||||
|
(displayln (real->decimal-string
|
||||||
|
(flsqrt
|
||||||
|
(let L ([vBv 0.0] [vv 0.0] [i 0])
|
||||||
|
(if (fx= i N) (fl/ vBv vv)
|
||||||
|
(let ([ui (flvector-ref u i)] [vi (flvector-ref v i)])
|
||||||
|
(L (fl+ vBv (fl* ui vi))
|
||||||
|
(fl+ vv (fl* vi vi))
|
||||||
|
(fx+ i 1))))))
|
||||||
|
9)))
|
Loading…
Reference in New Issue
Block a user