朱莉娅(Julia)中带有突变操作的for循环多线程

穆罕默德·萨德(Mohammad Saad)

我试图运行下面提到的代码for loop使用@threads了多线程,但是结果总是不匹配描绘输出数量的错误。

using Combinatorics, Base.Threads
import Base.Threads.@threads
func(x, y)
result = Float64[]
a = Float64[]
@threads for c in combinations(1:n, 2)
        a, b = c
        result = func(a, b)
        push!(result, result)
        push!(a, a)     
     end

在处理过程中观察到的错误:

DimensionMismatch("column :result has length 60 and column :a has length 50")

请提出一种方法,以确保不会遗漏循环中的任何突变。

弗朗索瓦·费沃特(FrancoisFévotte)

在您的示例中不起作用的一件事是,所有线程都可能同时通过 push!)对相同的向量(resulta进行了变异,从而允许发生竞争条件。

解决这个问题的一种方法是拥有一个向量集合(每个线程一个)。每个线程仅修改自己的向量(由标识threadid())。

使用这种技术,您的示例的简化版本可能如下所示:

# The function we want to apply to each element
julia> f(x) = 2x+1
f (generic function with 1 method)

# Two collections of vectors (one vector for each thread)
# that will hold the results for each thread
julia> results = [Float64[] for _ in 1:Threads.nthreads()];
julia> as      = [Float64[] for _ in 1:Threads.nthreads()]
8-element Vector{Vector{Float64}}:
 []
 []
 []
 []
 []
 []
 []
 []

julia> Threads.@threads for a in 1:10
           result = f(a)

           # Each thread only ever mutates its own result vector: 
           #    results[Threads.threadid()]
           push!(results[Threads.threadid()], result)
           push!(as[Threads.threadid()],      a)
       end

请注意,您将获得结果的集合,该结果由产生结果的线程的ID索引。

# Now you get a collection of results, indexed by the id of the thread which produced them
julia> results
8-element Vector{Vector{Float64}}:
 [3.0, 5.0]  # These results have been produced by thread #1
 [7.0, 9.0]
 [11.0]
 [13.0]
 [15.0]
 [17.0]
 [19.0]
 [21.0]

julia> as
8-element Vector{Vector{Float64}}:
 [1.0, 2.0]
 [3.0, 4.0]
 [5.0]
 [6.0]
 [7.0]
 [8.0]
 [9.0]
 [10.0]

最后,因此,您需要以某种方式连接或展平所有结果向量,以便将所有线程特定的结果合并为一个。一种方法是连接所有结果(这将分配一个新的大向量来保存所有结果):

julia> reduce(vcat, results)
10-element Vector{Float64}:
  3.0
  5.0
  7.0
  9.0
 11.0
 13.0
 15.0
 17.0
 19.0
 21.0

julia> reduce(vcat, as)
10-element Vector{Float64}:
  1.0
  2.0
  3.0
  4.0
  5.0
  6.0
  7.0
  8.0
  9.0
 10.0

另一种方法是直接对嵌套结果进行迭代,即时对其进行展平(以免分配两倍的内存来以平面方式存储它们):

julia> using Base.Iterators: flatten

julia> for r in flatten(results)
           println(r)
       end
3.0
5.0
7.0
9.0
11.0
13.0
15.0
17.0
19.0
21.0

julia> for (a, r) in zip(flatten(as), flatten(results))
           println("$a -> $r")
       end
1.0 -> 3.0
2.0 -> 5.0
3.0 -> 7.0
4.0 -> 9.0
5.0 -> 11.0
6.0 -> 13.0
7.0 -> 15.0
8.0 -> 17.0
9.0 -> 19.0
10.0 -> 21.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

朱莉娅中的虚拟变量

来自分类Dev

朱莉娅在GLSL中设置

来自分类Dev

Java中带有for循环的多线程

来自分类Dev

朱莉娅:pmap传递带有索引的向量

来自分类Dev

朱莉娅·杜夫(Julia Double)循环,遍历字典

来自分类Dev

朱莉娅:具有大量数据移动的并行For循环

来自分类Dev

朱莉娅中的稀疏复数矩阵

来自分类Dev

朱莉娅中的vcat StackOverflowError

来自分类Dev

朱莉娅:还是没有

来自分类Dev

朱莉娅:数组操作

来自分类Dev

朱莉娅(Julia)语言:有t检验吗?

来自分类Dev

朱莉娅:以循环宏为条件

来自分类Dev

您如何*获取*朱莉娅(Julia)中BLAS操作的线程数?

来自分类Dev

朱莉娅没有价值

来自分类Dev

朱莉娅中的加权相关

来自分类Dev

朱莉娅(Julia)中的“&=”语法是什么意思?

来自分类Dev

朱莉娅在Google Colab中

来自分类Dev

LightGraphs中的子图-朱莉娅

来自分类Dev

朱莉娅(Julia):如何有效计算Vector {Union {T,Missing}}中的遗失数量

来自分类Dev

朱莉娅减价中的纯HTML

来自分类Dev

朱莉娅(Julia):在for循环中累积数组(循环局部范围的问题)

来自分类Dev

朱莉娅(Julia)我决定在朱莉娅(Julia)中测试一些数学,但出现错误

来自分类Dev

朱莉娅中的NonlinearConstraintIndex是什么?

来自分类Dev

朱莉娅(Julia)中的标题与PGFPlots左对齐

来自分类Dev

朱莉娅中的加权相关

来自分类Dev

牛Julia在朱莉娅在薄荷

来自分类Dev

函数链中的条件朱莉娅(Julia-lang)

来自分类Dev

朱莉娅(Julia)中具有容器类型和矩阵向量乘积的类型稳定性

来自分类Dev

打破朱莉娅的循环