Multithreading 在julia中,是否有一个宏在每个线程中运行任务?
我有一个循环,我想运行多线程。它取决于预先分配的变量(数组),并且必须是每个线程的私有变量。如何在每个线程中进行此预分配?或者,是否有宏在每个线程中运行任务 我能想到的唯一解决方案依赖于元编程,因此转换代码的开销更大(我有许多要预分配的数组)。以下是我得到的有用信息:Multithreading 在julia中,是否有一个宏在每个线程中运行任务?,multithreading,julia,Multithreading,Julia,我有一个循环,我想运行多线程。它取决于预先分配的变量(数组),并且必须是每个线程的私有变量。如何在每个线程中进行此预分配?或者,是否有宏在每个线程中运行任务 我能想到的唯一解决方案依赖于元编程,因此转换代码的开销更大(我有许多要预分配的数组)。以下是我得到的有用信息: Threads.@threads for t = 1:Threads.nthreads() # pre-alloc arrays for each thread eval(Meta.parse("zl$(
Threads.@threads for t = 1:Threads.nthreads()
# pre-alloc arrays for each thread
eval(Meta.parse("zl$(t) = Array{Float64}(undef, ($(ns),$(ns)))"))
end
Threads.@threads for i = 1:N
t = Threads.threadid()
zl = eval(Meta.parse("zl$(t)"))
# do things...
end
我希望有一个类似于在C代码中使用OpenMP的解决方案
#pragma omp parallel
{
double* zl = malloc(ns * ns * sizeof(double));
#pragma omp for
for (size_t i = 0; i < N; i++) {
// do things...
}
}
#pragma omp并行
{
double*zl=malloc(ns*ns*sizeof(double));
#pragma omp for
对于(大小i=0;i
Julia中的规则很简单-如果你不知道如何做某事,元编程永远不是一个好方法:-)
您需要的模式是创建矩阵向量,并将每个矩阵提供给每个线程
ns = 3
zls = [Matrix{Float64}(undef,ns,ns) for t in 1:Threads.nthreads()]
Threads.@threads for i = 1:N
zl = zls[Threads.threadid()]
# do things with zl....
end
如果您想并行地预先分配zls
的内存,请尝试(尽管对于我能想到的所有场景,我怀疑这样做是否值得):
zls = Vector{Matrix{Float64}}(undef, Threads.nthreads())
Threads.@threads for i = 1:Threads.nthreads()
zls[i] = Matrix{Float64}(undef,ns,ns)
end