parallel: Small steps
This commit is contained in:
parent
ee1818160e
commit
3f67950050
|
|
@ -1,34 +1,19 @@
|
||||||
(define thread-count 4)
|
(define thread-proc (lambda (x) #t))
|
||||||
(define thread-proc (lambda () #t))
|
|
||||||
|
|
||||||
(define (new-thread)
|
(define (new-thread)
|
||||||
(let ((thread (make-thread
|
(make-thread
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(thread-specific-set!
|
(thread-specific-set!
|
||||||
(result (apply thread-proc
|
(current-thread)
|
||||||
(thread-specific (current-thread)))))))))
|
(thread-proc (thread-specific (current-thread)))))))
|
||||||
thread))
|
|
||||||
(define threads (make-list thread-count (new-thread)))
|
(define threads (make-list thread-count (new-thread)))
|
||||||
|
|
||||||
(define (parallel-map thunk lst)
|
(define-syntax parallel-map
|
||||||
(letrec*
|
(syntax-rules ()
|
||||||
((lst-length (length lst))
|
((_ env (l args body ...) lst)
|
||||||
(result '())
|
(let* ((lst-length (length lst))
|
||||||
(looper (index)
|
(thread-proc (eval `(lambda args body ...)
|
||||||
(when (< index lst-length)
|
(apply environment 'env))))
|
||||||
(for-each
|
(map thread-proc lst)
|
||||||
(lambda (thread)
|
))))
|
||||||
(when (< (+ index thread-index) lst-length)
|
|
||||||
(thread-specific-set! thread (list-ref lst (+ index thread-index)))))
|
|
||||||
threads '(0 1 2 3)) ;; FIXME Make thread-index dynamic
|
|
||||||
(for-each
|
|
||||||
(lambda (thread)
|
|
||||||
(when (< (+ index thread-index) lst-length)
|
|
||||||
thread-start! thread))
|
|
||||||
threads '(0 1 2 3))
|
|
||||||
(for-each thread-join! threads)
|
|
||||||
(map
|
|
||||||
(lambda (thread)
|
|
||||||
(thread-specific thread))
|
|
||||||
threads '(0 1 2 3))
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
(define-syntax parallel-map
|
(define-syntax parallel-map
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_ env (l args body ...) lst)
|
((_ env (l args body ...) lst)
|
||||||
(let ((l (eval `(lambda args body ...) (apply environment 'env))))
|
(let* ((lst-length (length lst))
|
||||||
(map l lst)))))
|
(proc (eval `(lambda args body ...) (apply environment 'env))))
|
||||||
|
(map proc lst)))))
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,9 @@
|
||||||
(scheme eval)
|
(scheme eval)
|
||||||
(retropikzel hardware-info)
|
(retropikzel hardware-info)
|
||||||
(retropikzel purer))
|
(retropikzel purer))
|
||||||
|
(include "parallel/shared.scm")
|
||||||
(cond-expand
|
(cond-expand
|
||||||
#;((library (srfi 18))
|
((library (srfi 18))
|
||||||
(import (srfi 18))
|
(import (srfi 18))
|
||||||
(include "parallel-srfi-18.scm"))
|
(include "parallel-srfi-18.scm"))
|
||||||
(else
|
(else
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
(define thread-count (guard (condition (else 4)) (cpu-count)))
|
||||||
Loading…
Reference in New Issue