我正在尝试使用 @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/