julia: передача pmap в векторах с индексами

Я хотел бы использовать Джулии pmap сделать что-то вроде этого:

pmap( f, v, inits[i])

где f это функция, которую я хочу вызвать параллельно v который является некоторым массивом. Я также хочу передать некоторые параметры f (inits), но inits сам по себе является массивом, и я хочу, чтобы i-й параметр передавался правильному процессу. Имеет ли это смысл?

Я мог бы сделать это, отсортировав "свою собственную" версию pmap, поскольку это легко сделать с помощью remotecall_fetch, Вот эта реализация, если вышеупомянутое сбивало с толку:

    i=1
    nextidx() = (idx=i; i+=1; idx)
    @sync begin
      for k in 1:np
        if k != myid() || np == 1
          @async begin
            while true
              idx = nextidx()
              if idx > chains
                break
              end
              result[idx] = remotecall_fetch(k, mcmc_sub, m, iters, burnin, 
                                             thin, idx, ps[idx], p)
            end
          end
        end
      end
    end

1 ответ

Решение

Предположим, у вас есть вход v что вы хотите запустить pmap на. Каждый элемент v также имеет связанный вектор единиц, которые хранятся в столбцах матрицы inits,

inits = reshape(randn(20), 5,4)
v = collect(1:4)

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

f = function(args::Tuple{Int64, Vector{Float64}})
  x, inits = args
  return sum(x * inits)
end

а затем сжать ваши входные данные и единицы измерения

args = collect(zip(v, [inits[:,j] for j in 1:4]))
pmap(f, args)
Другие вопросы по тегам