0

在 Julia 中,我想在并行 for 循环中打印出循环完成的迭代次数。

这是一种安全的方法吗,和/或有更好的方法吗?

a = SharedArray(Int, 10)
counter = SharedArray(Int, 1)
arr = 1:10
tot = length(arr)
@parallel for i in collect(arr)
    a[i] = i
    counter[1] += 1
    println("$i/$tot")
    sleep(rand()) # simulate a variable amount of computation
end
4

1 回答 1

1

在您的问题中,您不是使用 sharedcounter来打印迭代,而是使用 integer i。我从您的问题中假设您正在寻找一种在并行循环中打印不断增加的迭代次数的方法。这在异步执行中是不可能的,因为您不知道循环的执行顺序。

举个例子:假设 processor1 可以i=1,它可能需要很长时间。当处理器 1 执行另一个处理器时,可能会完成i=2并且i=3. 这将导致i=2,3print before i=1

您无法真正解决这个问题,因为这种并行行为(进程接管慢速进程)是并行计算的主要好处之一。

以下是示例:

># parallel sum with async execution
>sum_i =  @parallel (+) for i in 1:10
>  println(i)
>  i
>end

From worker 4:  8
From worker 4:  9
From worker 3:  5
From worker 4:  10
From worker 3:  6
From worker 2:  1
From worker 3:  7
From worker 2:  2
From worker 2:  3
From worker 2:  4

注意上面的错误顺序。

如果您选择一个处理器,您可以生成一个不断增加的整数列表。这些只会是特定处理器看到的那些,但这会给你一种关于你的函数做了多少的指示:

>sum_i =  @parallel (+) for i in 1:10
>  if myid() == 2
>    println(i)
>  end
>
>  i
>end

From worker 3:  5
From worker 3:  6
From worker 3:  7
于 2016-04-05T11:28:32.067 回答