multithreading - Julia 多线程 "broadcast return"

标签 multithreading julia

我是多线程领域的新手,我只想编写一个比较(大)排序二维数组的函数:

function check_duplicates(sites, generated_structures)
    for i in eachindex(generated_structures)
        sites == generated_structures[i] && return false
    end
    return true
end

“generated_structures”可能很大(超过 500 万个元素),为了加快速度,我正在考虑做这样的事情:

function check_duplicates(sites, generated_structures)
    Threads.@threads for i in eachindex(generated_structures)
        sites == generated_structures[i] && return false
    end
    return true
end

以便多个线程检查大数组的子部分。是否有可能一旦满足条件,函数就会停止并返回 false?现在一些线程返回 true,因为他们检查的子部分不包含匹配项。

最佳答案

一种方法是拥有一个公共(public)状态标志,每个线程都可以访问该标志,并在其他线程找到匹配项时退出。要以线程安全的方式执行此操作,有 Threads.Atomic:

function hasdup(val, itr)
    status = Threads.Atomic{Bool}(false)
    Threads.@threads for x in itr
        status[] && break
        (x == val) && (status[] = true)
    end
    return status[]
end

现在,我不太确定为什么对 status 的访问需要是线程安全的,因为它只会被写入以便将其设置为 true。删除 Atomic 包装器仍然有效,但速度要慢得多。

我从上面的代码中获得了不错的线程加速,但是线程开销相当大,所以如果你的比赛在记录的早期,线程版本会慢得多。

一个开销低得多的多线程库是 Polyester.jl,如果匹配得早,它会快得多。但是,它与 Threads 库不兼容,因此您不能将它嵌套在 Threads 中。

关于multithreading - Julia 多线程 "broadcast return",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74366173/

相关文章:

int - 相当于 Julia 中的 `int.bit_length()`

dataframe - 如何在 Julia 中嵌套/取消嵌套数据框?

multidimensional-array - 将 Array{T,N} 转换为 Array{Array{T,M},N-M} 的优雅方法

linux - os.File.Write() 线程在 golang 中安全吗?

C++如何使dll从主线程修改变量?

julia - Julia 集中图书馆

io - Julia:IO/文件数据的流式转换

multithreading - 使用 Omni Thread Library 在 Delphi 中异步获取函数结果

c - 在 Linux 上处理多线程断管情况的服务器端套接字最佳实践是什么?

java - 在多线程中调用重绘?