gpt4 book ai didi

multithreading - 在 julia 中,是否有一个宏可以在每个线程中运行一个任务?

转载 作者:行者123 更新时间:2023-12-03 12:58:18 25 4
gpt4 key购买 nike

我有一个要运行多线程的循环。它取决于预先分配的变量(数组),并且必须是每个线程私有(private)的。如何在每个线程中进行预分配?或者,是否有一个宏可以在每个线程中运行一个任务?
我能想到的唯一解决方案依赖于元编程,因此转换代码的开销更大(我有 许多 数组要预分配)。这是我得到的有效方法:

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...
}
}

最佳答案

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

关于multithreading - 在 julia 中,是否有一个宏可以在每个线程中运行一个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65810056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com