(defn run [nvecs nitems nthreads niters]
(let [vec-refs (vec (map (comp ref vec)
(partition nitems (range (* nvecs nitems)))))
swap #(let [v1 (rand-int nvecs)
v2 (rand-int nvecs)
i1 (rand-int nitems)
i2 (rand-int nitems)]
(dosync
(let [temp (nth @(vec-refs v1) i1)]
(alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))
(alter (vec-refs v2) assoc i2 temp))))
report #(do
(prn (map deref vec-refs))
(println "Distinct:"
(count (distinct (apply concat (map deref vec-refs))))))]
(report)
(dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))
(report)))
Search This Blog
Saturday, September 12, 2009
threads and transactional memory
This beautiful program is straight from the clojure docs:
It creates nvecs vectors of nitems numbers, e.g. [1 2 3][4 5 6][7 8 9]
and then runs nthreads threads in parallel, swapping numbers from vector to vector niters times
Subscribe to:
Post Comments (Atom)
Damn , I recently found this blog. It's really awesome , keep it up!
ReplyDelete