Julia 并发编程 ---- 多线程与多进程的一些使用建议

这里先看一份代码示例

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)

这两个循环执行过程差异很大。

1:在第一个循环中每个线程在不断更新数组中的同一个元素。最有可能的是,由于在一个线程中只有一个内存单元被更新,所以处理器缓存机制可以用来加快速度。另一方面,在第二个循环中每个进程都在更新几个不同的内存单元(内部会做异步拆分),这时的缓存可能起不到作用。

2:第一个数组是Float64类型,而第二个数组则是Int64类型

再执行下,虽然结果一样,但是执行时间却是有差异的。

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

另一个问题是,当使用分布式时会有进程间通信,但是使用线程没有。基本上,使用多进程间处理持续几毫秒的作业没有意义。但是当增加处理量时,差异可能会出现。所以什么时候用多线程还是多进程应该是有一些准则的。

  1.  进程更健壮(线程仍处于试验阶段)
  2.  如果不需要使用锁或原子变量,线程更简单些
  3. 当本地并行度超过16个线程,程序就会变得效率低下,应该使用分布式线程(这个数字可能不是太准,还要看具体的硬件或者软件平台)
  4. 为其他人编写实用程序包时使用线程-不要在包内分发代码。说明:如果向包中添加多线程,它的行为对用户应该是透明的。另一方面,Julia的多线程(分布式包)抽象没有区分并行和分布式——也就是说,执行任务的worker可以是本地的,也可以是远程的。这使得代码的设计方式有了根本的区别(例如sharedarray vs distributedarray),此外,代码的设计也可能取决于服务器的数量或限制节点间是否可以通信等情况。因此,通常情况下,分布式相关程序包的逻辑应该从标准实用程序包中分离出来,而多线程功能可以对包用户透明。当然,这条规则也有一些例外,比如提供一些分布式数据处理服务器工具等等,但这是一条一般的经验法则。
  5. 对于大规模的计算,最好是使用进程,因为可以很容易地进入一个计算机集群,并将工作负载分布在数百台机器上。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Julia是一门编程语言,它具有预处理多线程的能力。根据引用中的信息,AMLPipelineBase这个库是用纯Julia编写的,包括其依赖关系。为了实现可伸缩性和性能,未来的目标是使用线程安全的ML Julia库来利用Julia的本机多线程。这意味着在使用Julia编写的代码中,可以使用多线程来并行处理任务,从而提高代码的执行效率。 同时,Julia还具有强大的类似shell的功能,可以用于管理其他进程,这意味着可以在Julia中进行多线程编程,并通过管理和协同多个进程来实现预处理多线程的功能。此外,Julia还提供了类似Lisp的宏和其他元编程工具,可以进一步增强多线程编程的灵活性和扩展性。引用中提到Julia还具有与其他语言的外部函数接口,例如C / Fortran,Python,R等,这意味着可以与其他语言的多线程编程结合使用。 综上所述,Julia具有预处理多线程的能力,并且提供了各种工具和接口,使得多线程编程更加方便和灵活。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [AMLPipelineBase.jl:AutoMLPipeline.jl和TSML.jl的基本包](https://download.csdn.net/download/weixin_42113754/15170831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Julia是什么?为什么突然这么火?](https://blog.csdn.net/farley119/article/details/82178827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值