在Julia中,共享数组能够安全地处理并发写入吗?

7

我试图在Julia中优化一个数组操作,但是注意到有时我的矩阵会出现相当大的误差。我还注意到,在Julia中存在并发写入共享数组的同一索引的可能性。我想知道Julia能否安全地处理它。如果不能,我该如何处理?

以下是我的问题的基本示例:

for a list of arbitrary x,y indexes in array J
    j[x,y] += some_value
end

Julia能否处理这种情况,或者像C语言一样存在覆盖数据的可能性。在Julia中是否存在原子操作来弥补这一点?

1个回答

5

共享数组故意不使用锁,因为锁可能很耗费资源。最简单的方法是将不重叠的工作分配给不同的进程。不过,您可以搜索是否有人编写了锁定库,或者自己动手试试:https://en.wikipedia.org/wiki/Mutual_exclusion


显然,Julia确实支持锁定。它是Base Package的一部分:https://dev59.com/4JHea4cB1Zd3GeqPmDR0。 - Skylion
1
这是正确的,不过请记住,该解决方案设计用于处理分布在多台计算机上的工作。如果您想要每个数组元素一个锁,我猜你会对通用解决方案的开销感到不满,并希望使用针对SharedArrays进行了优化的解决方案。 - tholy
鉴于这些信息,那么你会有什么建议呢?我想,如果我等到Julia 0.5发布,我们可以添加对PThread的支持并使用原子性操作,除非您有更优雅的解决方案?理想情况下,代码能在分布式系统上运行是不错的,但这不是必须的。 - Skylion
1
首先,随意尝试内置锁定功能;如果您对性能感到满意,那太好了。如果不是,我会选择我链接页面上的算法之一(Szymanski?)并实现它。我不能确定,因为我没有尝试过,但如果代码行数超过50行,我会感到惊讶...而您将创建一个可能受到许多人欢迎的包。 - tholy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接