Parallel processing 循环的Julia并行计算
我想从一个大的上三角矩阵计算元素的总和。下面是常规的Julia代码Parallel processing 循环的Julia并行计算,parallel-processing,julia,Parallel Processing,Julia,我想从一个大的上三角矩阵计算元素的总和。下面是常规的Julia代码 function upsum(M); n = size(M)[1]; sum = 0 for i = 1:n-1 for j = i+1:n sum = sum + M[i,j] end end return sum end R = randn(10000,10000) upsum(R) 由于矩阵非常大,我想知道是否存在提高速度的方法。这里如何使用并行计算?在这种情况下
function upsum(M); n = size(M)[1]; sum = 0
for i = 1:n-1 for j = i+1:n
sum = sum + M[i,j]
end
end
return sum
end
R = randn(10000,10000)
upsum(R)
由于矩阵非常大,我想知道是否存在提高速度的方法。这里如何使用并行计算?在这种情况下,我将使用线程而不是并行处理。下面是一个示例代码:
using Base.Threads
function upsum_threads(M)
n = size(M, 1)
chunks = nthreads()
sums = zeros(eltype(M), chunks)
chunkend = round.(Int, n * sqrt.((1:chunks) ./ chunks))
@assert minimum(diff(chunkend)) > 0
chunkstart = [2; chunkend[1:end-1] .+ 1]
@threads for job in 1:chunks
s = zero(eltype(M))
for i in chunkstart[job]:chunkend[job]
@simd for j in 1:(i-1)
@inbounds s += M[j, i]
end
end
sums[job] = s
end
return sum(sums)
end
R = randn(10000,10000)
upsum_threads(R)
即使您删除@threads,它也会给您一个显著的加速,速度应该会快得多
您可以通过设置Julia_NUM_threads环境变量来选择Julia使用的线程数。我非常感谢您的帮助!我还有一个问题,如果我想同时计算大的上三角矩阵中每个元素的平方和呢。我试过@inbounds s+=M[j,I]@inbounds sq+=M[j,I]^2,它有效。有没有更好的方法可以做到这一点?两个内环可能比一个内环中的两个操作更好,因为我认为@simd应该可以工作,但如果这两个设计之间有任何显著差异,您必须进行基准测试。谢谢您的回复!你是说在1:1块中有两个@threads作为作业更好吗?我是说在1:I-1中为j使用内循环@simd,因为M[j,I]应该仍然在CPU缓存中,但我还没有对其进行基准测试,所以复制最外层的循环可能不会太慢。