Parallel processing Julia@spawn和pmap()处理一个需要跳转和Ipopt的令人尴尬的并行问题

Parallel processing Julia@spawn和pmap()处理一个需要跳转和Ipopt的令人尴尬的并行问题,parallel-processing,julia,distributed-computing,Parallel Processing,Julia,Distributed Computing,我非常感谢在Julia中对以下伪代码进行并行化的帮助(对于这篇冗长的文章,我表示道歉): 显然,只要不访问p和Q的列,并且一次访问p和Q的同一列i,那么for循环就可以独立执行。我唯一需要注意的是X的I列和Y列是tempX和tempY的正确对,我不太关心I=1,…,N顺序是否保持(希望这是有意义的!) 我阅读了官方文档和一些在线教程,并使用@spawn和fetch编写了以下内容,该工具通过将nda[j][a]等替换为占位符编号1.0和180来实现插入部分: using Distributed

我非常感谢在Julia中对以下伪代码进行并行化的帮助(对于这篇冗长的文章,我表示道歉):

显然,只要不访问
p
Q
的列,并且一次访问
p
Q
的同一列
i
,那么
for
循环就可以独立执行。我唯一需要注意的是
X
I
列和
Y
列是
tempX
tempY
的正确对,我不太关心I=1,…,N顺序是否保持(希望这是有意义的!)

我阅读了官方文档和一些在线教程,并使用
@spawn
fetch
编写了以下内容,该工具通过将
nda[j][a]
等替换为占位符编号1.0和180来实现插入部分:

using Distributed

addprocs(2)
num_proc = nprocs()

@everywhere function insertPQ(P, Q)
    println(myid())
    data = zeros(4*length(P))
    k = 1
    for i = 1:length(P)
        data[k:k+3] = [1.0, 180., P[i], Q[i]]
        k += 4
    end
    return data
end

P = [0.99, 0.99, 0.99, 0.99]
Q = [-0.01, -0.01, -0.01, -0.01]
for i = 1:5  # should be 4 x 32
    global P = hcat(P, (P .- 0.01))
    global Q = hcat(Q, (Q .- 0.01))
end

datas = zeros(16, 0)  # serial result
datap = zeros(16, 32)  # parallel result

@time for i = 1:32
    s =  fetch(@spawn insertPQ(P[:, i], Q[:, i]))
    global datap = hcat(datap, s)
end

@time for i = 1:32
    k = 1
    for j = 1:4
        datas[k:k+3, i] = [1.0, 180., P[j, i], Q[j, i]]
        k += 4
    end
end

println(datap == datas)
上面的代码很好,但我注意到输出始终是worker 2->3->4->5->2。。。而且比串行情况慢得多(我正在我只有4核的笔记本电脑上测试,但最终我会在集群上运行它)。当添加到
insertPQ()
中的
run\u solver\u A/B
中时,运行花费了很长时间,我不得不停止它

至于
pmap()
,我不知道如何将整个向量传递给函数。我可能误解了文档,但“通过使用可用的工作人员和任务将f应用于每个元素来转换集合c”听起来好像我只能按此元素进行操作?不可能。上周我参加了茱莉亚的介绍会,向讲师询问了这一点。他说我应该使用
pmap
,从那以后我一直在努力让它工作

那么,如何并行化我的原始伪代码呢?非常感谢您的任何帮助或建议

using Distributed

addprocs(2)
num_proc = nprocs()

@everywhere function insertPQ(P, Q)
    println(myid())
    data = zeros(4*length(P))
    k = 1
    for i = 1:length(P)
        data[k:k+3] = [1.0, 180., P[i], Q[i]]
        k += 4
    end
    return data
end

P = [0.99, 0.99, 0.99, 0.99]
Q = [-0.01, -0.01, -0.01, -0.01]
for i = 1:5  # should be 4 x 32
    global P = hcat(P, (P .- 0.01))
    global Q = hcat(Q, (Q .- 0.01))
end

datas = zeros(16, 0)  # serial result
datap = zeros(16, 32)  # parallel result

@time for i = 1:32
    s =  fetch(@spawn insertPQ(P[:, i], Q[:, i]))
    global datap = hcat(datap, s)
end

@time for i = 1:32
    k = 1
    for j = 1:4
        datas[k:k+3, i] = [1.0, 180., P[j, i], Q[j, i]]
        k += 4
    end
end

println(datap == datas)