Julia 多线程:如何控制变量的局部范围

Julia Multithreading: how to control local scope of variables

我对 julia 还很陌生,我正在尝试使用 julia 的多线程能力。

下面是我为探索 julia 能力而制作的玩具示例。这是我正在尝试做的一个非常简化的版本。 我需要并行化循环。在这个循环中,我正在执行一些需要缓冲区数组的计算(在下面的示例中,缓冲区当然是不必要的)。缓冲区也不能在线程之间共享,因为它会导致竞争条件。

我正在使用宏@threads 来并行化我的循环。问题是我找不到一种方法来定义不同的线程应该如何与 buf 数组交互:

function calcparallel(buf::AbstractArray,result::AbstractArray)

   @threads for i=1:length(result) 
        buf[1] = float(i)         
        buf[2] = 1.0/float(i) 
        buf[3] = sqrt(i)

        result[i] = buf[1] * buf[3] + buf[2]

    end
    return result 
end

n = 1000
nn = 10
buf2 = zeros(Float64,nn)
result2  = zeros(Float64,n)


@time calcparallel(buf2,result2)

线程局部缓冲区的模式是这样的:

function calcparallel(buf::AbstractArray,result::AbstractArray)
   bufs = [zeros(3) for _ in Threads.nthreads()]
   @threads for i=1:length(result) 
        buf = bufs[Threads.threadid()]
        buf[1] = float(i)         
        buf[2] = 1.0/float(i) 
        buf[3] = sqrt(i)

        result[i] = buf[1] * buf[3] + buf[2]

    end
    return result 
end