在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
答案 0 :(得分:1)
在您的问题中,您没有使用共享counter
来打印迭代,而是使用整数i
。
我从您的问题中假设您正在寻找一种在并行循环中打印不断增加的迭代次数的方法。这是不可能的异步执行,因为你不知道循环的执行顺序。
举个例子:让我们说处理器1执行i=1
并且可能需要太长时间。当processor1执行另一个处理器时,可能会完成i=2
和i=3
。这会导致在i=2,3
之前打印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