multithreading - 使用 @async @sync 宏来提高性能

标签 multithreading performance julia task

我正在尝试使用 @async @sync 并行化此函数

function INSR_opt(f)
    function INSR0_opt(seq)
        len = length(seq)
        res = seq[end]
        @inbounds @sync for i in range(len-2,step=-1,stop=0)
            @async res = f([seq[i+1], res])
        end
        return res
    end
    return INSR0_opt
end

我使用宏的方式对我来说似乎是正确的,但性能却变得更糟 没有宏:

122.962 μs (1073 allocations: 69.00 KiB)

使用宏:

154.681 μs (1091 allocations: 69.95 KiB)

我什至尝试使用@spawn而不是@async,但性能仍然不会提高。我检查了使用 Threads.nthreads() 运行的线程数,它们是 4

最佳答案

您的代码是顺序的,因为您在 res 中具有递归依赖性 - 因此尝试并行化它既不可能,也可能导致不正确的结果。本质上,您的代码尝试以效率较低且非通用的方式重新实现 foldr:

julia> INSR_opt(((a, b),) -> a => b)(1:4)
1 => (2 => (3 => 4))

julia> foldr(=>, 1:4)
1 => (2 => (3 => 4))

关于multithreading - 使用 @async @sync 宏来提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72646724/

相关文章:

arrays - 在 Julia 中将整数数组转换为字符串数组

ios - 在 UITableView 滚动时在 MKMapView 上放置图钉,从特定屏幕位置的单元格获取坐标。制作引脚 "dance."

multithreading - 没有 web worker 的 Javascript 后台处理?

c# - 针对大型 List<string> 测试大量字符串的最有效方法

.net - 在磁盘中存储许多文件的最佳方法

arrays - Julia:如何沿指定维度提取数组的一部分

python - 为什么多处理锁定失败?

c++ - 什么是并行 for 循环,应该如何/何时使用它?

android - 在 Android 生命周期中分配 Controller 类的最佳位置是什么?

julia - 复制除一列以外的矩阵的有效方法