Julia 并行用于数组的循环项,而不与所有工作线程共享

Julia 并行用于数组的循环项,而不与所有工作线程共享,julia,Julia,我正在使用大数据阵列,大约10^10个元素。我通过调用某个函数来填充这些数组的条目。所有条目都是独立的,所以我想利用这一点,通过并行for循环同时填充数组,该循环运行在一组索引上并调用函数。我知道ShareDarray以及我通常是如何实现这种东西的,但是因为我使用的是巨大的数组,我不想把它们分享给所有的工作人员。我希望仅在主辅助进程上保留数组,然后执行并行for循环,并将每个循环的结果传输给主辅助进程以存储在数组中 例如,这是我通常对小型阵列执行的操作 H = SharedArray{Compl

我正在使用大数据阵列,大约10^10个元素。我通过调用某个函数来填充这些数组的条目。所有条目都是独立的,所以我想利用这一点,通过并行for循环同时填充数组,该循环运行在一组索引上并调用函数。我知道ShareDarray以及我通常是如何实现这种东西的,但是因为我使用的是巨大的数组,我不想把它们分享给所有的工作人员。我希望仅在主辅助进程上保留数组,然后执行并行for循环,并将每个循环的结果传输给主辅助进程以存储在数组中

例如,这是我通常对小型阵列执行的操作

H = SharedArray{ComplexF64}(n,n) #creates a shared array of size n*n
@sync @distributed for i in 1:q 
    H[i] = f(i) #f is a function defined on every worker
end

这种构造的问题是,如果数组n的大小太大,那么与所有工作人员共享它不是很有效。有没有办法绕过这个问题?我意识到我的问题可能很幼稚,对此我深表歉意。

A
SharedArray
不是在员工中复制的!它只允许所有进程访问相同的内存区域。这确实非常快,因为工人之间没有通信开销。主进程只需查看由工作进程填充的内存区域即可

SharedArrays
的唯一缺点是,中的所有工作线程都位于同一主机上。如果使用
DistributedArray
,由于进程间通信,您只会添加不必要的分配,因为每个工作进程只持有自己的数组部分

让我们看一下(这是用于共享和分布式阵列的两个等效代码):

现在是板凳:

julia> @btime f1();
7.151 ms (1032 allocations: 42.97 KiB)

julia> @btime(sum(f1()));
7.168 ms (1022 allocations: 42.81 KiB)


julia> @btime f2();
7.110 ms (1057 allocations: 42.14 KiB)

julia> @btime sum(f2());
7.405 ms (1407 allocations: 55.95 KiB)
结论:


在一台机器上,执行时间大致相等,但当使用
distributedarray
时,主节点收集数据会增加大量内存分配。因此,在一台机器上,您总是希望使用
SharedArrays
(而且API也更简单)。

我并不是真的做paralles的东西,但这不是正确的用例吗?
julia> @btime f1();
7.151 ms (1032 allocations: 42.97 KiB)

julia> @btime(sum(f1()));
7.168 ms (1022 allocations: 42.81 KiB)


julia> @btime f2();
7.110 ms (1057 allocations: 42.14 KiB)

julia> @btime sum(f2());
7.405 ms (1407 allocations: 55.95 KiB)