【发布时间】:2017-08-15 05:10:31
【问题描述】:
我运行了一些示例并得到了一些结果。我得到了大量的迭代,我们可以得到一个好的结果,但是对于更少的迭代,我们可以得到一个更差的结果。
我知道有一点开销,这绝对没问题,但是有什么方法可以比顺序方式更好地以并行方式运行一些迭代次数更少的循环?
x = 0
@time for i=1:200000000
x = Int(rand(Bool)) + x
end
7.503359 秒(200.00 M 分配:2.980 GiB,2.66% gc 时间)
x = @time @parallel (+) for i=1:200000000
Int(rand(Bool))
end
0.432549 秒(3.91 k 分配:241.138 KiB)
我在这里并行得到了很好的结果,但在下面的例子中没有。
x2 = 0
@time for i=1:100000
x2 = Int(rand(Bool)) + x2
end
0.006025 秒(98.97 k 分配:1.510 MiB)
x2 = @time @parallel (+) for i=1:100000
Int(rand(Bool))
end
0.084736 秒(3.87 k 分配:239.122 KiB)
【问题讨论】:
-
我猜在一定次数的迭代之后使用线程的开销是值得的
-
@MauricePerry 这不是线程,而是多处理。多处理比线程有更多的开销,因为它是完全异步的,甚至可以在其他计算机上拥有进程。 @ReD,您需要在每个流程上进行“足够”的工作才能使多处理获得回报。否则你应该看看通过
Threads.@threads使用线程。 -
您介意一些术语吗?这不是 [Parallel] 进程执行,而是一个 [Concurrent] 调度 -- 正如定义的 (cit:) -- [Parallel] 处理是,与仅 [并发] 处理形成鲜明对比的是,保证启动/执行/完成以并行方式执行的所有线程级和/或指令级任务,并保证完成同时执行的代码路径。 如果是真正的 [Parallel] 执行,应该有 200E+6 个 CPU 核心来允许这种 [Parallel] 执行。不在这里,@parallel 装饰器永远不会创建 CPU
-
@ReD 有关 (
SEQ:setup-overheads,PAR:HPC-payload) 加速的详细信息,请不要犹豫查看一篇关于(开销感知)Amdahl-Law + 数据关于 Point-of-Diminishing-Returns 的帖子,如 >>> stackoverflow.com/a/45562881中类似动机问题中可实现的加速中所述>
标签: julia