Parallel processing 循环的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) 由于矩阵非常大,我想知道是否存在提高速度的方法。这里如何使用并行计算?在这种情况下

我想从一个大的上三角矩阵计算元素的总和。下面是常规的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)

由于矩阵非常大,我想知道是否存在提高速度的方法。这里如何使用并行计算?

在这种情况下,我将使用线程而不是并行处理。下面是一个示例代码:

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缓存中,但我还没有对其进行基准测试,所以复制最外层的循环可能不会太慢。