|
From: | Damien Mattei |
Subject: | Re: map-par slower than map |
Date: | Thu, 13 Oct 2022 15:43:46 +0200 |
On Thu, 13 Oct 2022, Damien Mattei <damien.mattei@gmail.com> wrote:
> the code did not worked when data length were more little than number of
> cpus (6 on my host) (iota 5) returns #unsepcified:
Yeah sorry I miss indended the output and the rest. Here's a version
that should work:
--8<---------------cut here---------------start------------->8---
(use-modules
(srfi srfi-1)
(ice-9 threads))
(define* (par-map-vector proc input
#:optional
(max-thread (current-processor-count)))
(let* ((block-size (quotient (vector-length input) max-thread))
(rest (remainder (vector-length input) max-thread))
(output (make-vector (vector-length input) #f)))
(when (not (zero? block-size))
(let ((mtx (make-mutex))
(cnd (make-condition-variable))
(n 0))
(fold
(lambda (scale output)
(begin-thread
(let lp ((i 0))
(when (< i block-size)
(let ((i (+ i (* scale block-size))))
(vector-set! output i (proc (vector-ref input i))))
(lp (1+ i))))
(with-mutex mtx
(set! n (1+ n))
(signal-condition-variable cnd)))
output)
output
(iota max-thread))
(with-mutex mtx
(while (not (< n max-thread))
(wait-condition-variable cnd mtx)))))
(let ((base (- (vector-length input) rest)))
(let lp ((i 0))
(when (< i rest)
(let ((i (+ i base)))
(vector-set! output i (proc (vector-ref input i))))
(lp (1+ i)))))
output))
--8<---------------cut here---------------end--------------->8---
--
Olivier Dion
oldiob.dev
[Prev in Thread] | Current Thread | [Next in Thread] |