Есть ли способ контролировать количество потоков, используемых с pmap? - PullRequest
6 голосов
/ 16 декабря 2010

Я просто провожу некоторое тестирование производительности с помощью clojure с использованием pmap и хотел бы иметь возможность контролировать количество потоков, используемых с pmap. Я знаю, что при использовании чего-то вроде OpenMP можно установить количество потоков с помощью omp_set_num_threads (). Мне было интересно, будет ли что-нибудь подобное в clojure.

1 Ответ

7 голосов
/ 16 декабря 2010

Вот код для pmap:

(defn pmap
  "Like map, except f is applied in parallel. Semi-lazy in that the
  parallel computation stays ahead of the consumption, but doesn't
  realize the entire result unless required. Only useful for
  computationally intensive functions where the time of f dominates
  the coordination overhead."
  ([f coll]
   (let [n (+ 2 (.. Runtime getRuntime availableProcessors))
         rets (map #(future (f %)) coll)
         step (fn step [[x & xs :as vs] fs]
                (lazy-seq
                 (if-let [s (seq fs)]
                   (cons (deref x) (step xs (rest s)))
                   (map deref vs))))]
     (step rets (drop n rets))))

Как видите, pmap берет всех доступных процессоров и использует их циклически. Итак, нет, нет способа установить количество потоков ... но вы всегда можете написать свой собственный pmap, который обеспечит такую ​​функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...