Julia 多线程:如何控制变量的局部范围
Julia Multithreading: how to control local scope of variables
我对 julia 还很陌生,我正在尝试使用 julia 的多线程能力。
下面是我为探索 julia 能力而制作的玩具示例。这是我正在尝试做的一个非常简化的版本。
我需要并行化循环。在这个循环中,我正在执行一些需要缓冲区数组的计算(在下面的示例中,缓冲区当然是不必要的)。缓冲区也不能在线程之间共享,因为它会导致竞争条件。
我正在使用宏@threads 来并行化我的循环。问题是我找不到一种方法来定义不同的线程应该如何与 buf 数组交互:
- 有没有办法定义数组是否应该共享或者每个线程都有它的副本。例如,它在 OpenMP 中使用私有或共享变量声明系统的方式?
- 在循环中初始化数组不是一个选项,因为它会在每个步骤创建重新分配内存,而不是为每个线程创建一次。
- 是否有更适合此类应用程序的其他 julia 库?
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
我对 julia 还很陌生,我正在尝试使用 julia 的多线程能力。
下面是我为探索 julia 能力而制作的玩具示例。这是我正在尝试做的一个非常简化的版本。 我需要并行化循环。在这个循环中,我正在执行一些需要缓冲区数组的计算(在下面的示例中,缓冲区当然是不必要的)。缓冲区也不能在线程之间共享,因为它会导致竞争条件。
我正在使用宏@threads 来并行化我的循环。问题是我找不到一种方法来定义不同的线程应该如何与 buf 数组交互:
- 有没有办法定义数组是否应该共享或者每个线程都有它的副本。例如,它在 OpenMP 中使用私有或共享变量声明系统的方式?
- 在循环中初始化数组不是一个选项,因为它会在每个步骤创建重新分配内存,而不是为每个线程创建一次。
- 是否有更适合此类应用程序的其他 julia 库?
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