gpt4 book ai didi

julia - 阐明线程使用和进程的好处

转载 作者:行者123 更新时间:2023-12-04 09:31:54 25 4
gpt4 key购买 nike

我是使用 Julia 的新手,经过一些关于数值分析编程的类(class)后,我成了我的爱好。
我对所有内核进行了一些测试,并对线程进行了相同的比较。我注意到使用线程循环比使用进程进行更重的计算更好,但是在加法方面大致相同。 (例如,随机选择操作)
经过一些研究,它有点模糊,我最终希望从使用相同语言的人那里获得一些观点,如果这很重要的话。
一些技术信息:8 个物理内核,julia 在 addprocs() 之后添加了 16 个向量和 nthreads() is 16

using Distributed
addprocs()
@everywhere using SharedArrays;
@everywhere using BenchmarkTools;

function test(lim)
r = zeros(Int64(lim / 16),Threads.nthreads())
Threads.@threads for i in eachindex(r)
r[Threads.threadid()] = (BigInt(i)^7 +5)%7;
end
return sum(r)
end
@btime test(10^4) # 1.178 ms (240079 allocations: 3.98 MiB)

@everywhere function test2(lim)
a = SharedArray{Int64}(lim);
@sync @distributed for i=1:lim
a[i] = (BigInt(i)^7 +5)%7;
end
return sum(a)
end
@btime test2(10^4) # 3.796 ms (4413 allocations: 189.02 KiB)

最佳答案

请注意,您的循环会做非常不同的事情。

  • 在第一个循环中,每个线程不断更新数组的同一个单元格。很可能因为在单个线程中只有一个内存单元被更新,处理器缓存机制可用于加快速度。
    另一方面,第二个循环每个进程都在更新几个不同的内存单元,这样的缓存是不可能的。
  • 第一Array持有 Float64值,而第二个持有 Int64

  • 纠正这些事情后,差异变小了(这是在我的笔记本电脑上,我只有 8 个线程):
    julia> @btime test(10^4)
    2.781 ms (220037 allocations: 3.59 MiB)
    29997

    julia> @btime test2(10^4)
    4.867 ms (2145 allocations: 90.14 KiB)
    29997
    现在另一个问题是当 Distributed用于您正在进行使用时不会发生的进程间通信 Threads .
    基本上,进程间处理对于持续几毫秒的作业没有意义。当您尝试增加处理量时,差异可能会开始缩小。
    所以什么时候使用什么 - 这取决于......一般准则(有些主观)如下:
  • 进程更健壮(线程仍处于试验阶段)
  • 只要您不需要使用锁定或原子值,线程就会更容易
  • 当并行度超过 16 个线程时,效率会降低,Distributed应该使用(这是我个人的观察)
  • 为其他人编写实用程序包时使用线程 - 不要在包内分发代码。说明:如果将多线程添加到包中,它的行为对用户来说是透明的。另一方面,Julia 的多处理(Distributed 包)抽象不区分并行和分布式——也就是说,您的工作人员可以是本地的也可以是远程的。这使得代码的设计方式有根本区别(例如 SharedArraysDistributedArrays ),此外,代码的设计也可能取决于例如服务器的数量或限制节点间通信的可能性。因此通常情况下,Distributed -相关的包逻辑应该与标准实用程序包分开,而多线程功能可以对包用户透明。当然,这条规则有一些异常(exception),例如提供一些分布式数据处理服务器工具等。但这是一般的经验法则。
  • 对于大规模计算,我总是使用进程,因为您可以轻松地使用它们进入计算机集群并将工作负载分配到数百台机器上。
  • 关于julia - 阐明线程使用和进程的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62805253/

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