多核新观念-象使用内存一样使用CPU?

news/2024/7/8 2:39:18
 
多核新观念-象使用内存一样使用CPU?
多核时代,很重要的一点就是要将多个CPU核同时运转起来,提高CPU的利用率,说得专业一点就是要提高多核CPU的加速比系数。
但是并不是任何时候都可以同时将多个核运转起来,比如一些不能并行化执行的代码,特别是使用了锁的代码,它的执行是串行化的,无法同时利用多个核,还有负载平衡问题,多个任务无法划分得很均匀,导致实际情况中有些任务先运行完,有些任务后运行完,先运行完的CPU核就处于空闲状态。
是不是任何时候都需要将多个核利用到极致呢?答案是否定的,比如一个服务器软件,如果只有一个客户端连接过来,那么只要用一个核来处理这个请求已经绰绰有余了,何必非要同时将多个核同时运行起来呢? 再比如在客户端软件中,客户做了一个操作后,机器只是进行一个时间非常短的运算就结果返回给用户,然后机器处于空闲状态直到用户的下一次操作为止,在这种情况下,由于机器运算量很小,一个核进行运算完全能够满足用户所需的性能需求,就没有必要同时利用多个核进行运算,因为很小的计算量情况下,多个核同时运行效率可能还不如一个核。
既然有那么多情况下不需要多个核同时进行运算,那么买多核的机器干什么? 这不由得将CPU和内存比较起来,比如装了一个2G内存的机器,其实很多情况下是不可能将2G的内存都用完的,但是当运行一些大的应用,或者玩一些大型游戏的情况下,内存就基本上都利用上了,其实以后用多核CPU可能就象用内存一样,并不是任何时候都需要将所有的CPU核都用上的,只有计算量很大的情况下才需要完全利用多个CPU核来进行计算,也就是说全部的CPU核主要是为计算达到一定规模时才全部使用的,当然这个计算规模随CPU核数的不同而不同。
当然使用CPU和使用内存并不是完全相同的,因为现在软件规模越来越大,大多数计算的规模是可以达到为多核而使用的,因为软件规模会随着CPU核数的增加而同步增长,大部分情况下多个CPU核都是可以充分利用上的,而内存则不一样,不论是客户端机还是服务器,可能大部分时候内存利用率并不是很高,只有少数高峰时候才能将内存全部用上。
 
 相关文章连接:
  • OpenMP创建线程中的锁及原子操作性能比较
  • 多核编程中的任务随机竞争模式的概率分析
  • 多核编程中的任务分组竞争模式
 



http://www.niftyadmin.cn/n/3657766.html

相关文章

多核系统中三种典型锁竞争的加速比分析

多核系统中三种典型锁竞争的加速比分析目录1.1 引言... 11.2 任务粒度因子与锁粒度因子... 21.3 固定式锁竞争中的加速比分析... 31.4 随机锁竞争中的加速比分析... 31.5 分布式锁竞争的加速比分析... 41.6 结论... 51.7 参考文献&#xff…

Python 字典update

x1 {q:12, w:13, e:14} x2 {q:22, w:77} x1.update(x2) print(x1) 上面的是一个程序例子,x1.update(x2), 代表如果x2中的键和x1中有相同的部分,则将x1中对应的键所对应的值更新为x2中的这个键值。上述程序的运行结果为: {q: 2…

无锁编程与分布式编程那个更适合多核CPU?

无锁编程与分布式编程那个更适合多核CPU?前一篇文章多核系统中三种典型锁竞争的加速比分析讲过了三种典型锁竞争情况下的加速比情况,特别是分布式锁竞争的加速比和CPU核数成正比,有很好的加速比性能。由于近些年在学术界中,无锁编…

pytorch 使用多块显卡训练模型

一般的程序都是默认了单块显卡训练模型,如果batch_size过大的话,单块显卡是不好使的,这就需要多块显卡并行训练了,如何实现呢,特别简单 : net nn.DataParallel(net).cuda() 上面这行代码就可以实现了&am…

OpenMP中的任务调度

OpenMP中的任务调度OpenMP中,任务调度主要用于并行的for循环中,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代的话,会造成各个线程计算负载不均衡,这会使得有些线程先执行完,有…

pytorch 多卡并行计算保存模型和加载模型 (遗漏module的解决)

今天使用了多卡进行训练,保存的时候直接是用了下面的代码: torch.save(net.cpu().state_dict(),epoch1.pth) 我在测试的时候,想要加载这个训练好的模型,但是报错了,说是字典中的关键字不匹配,我就将新创建…

SD2.0大会的一些随想

SD2.0大会的一些随想29号一早就赶到了九华山庄,CSDN的潘微微很热情地帮我安排好了住宿,然后就是去主会场听演讲,我到会场的时候已经比较晚了,好像是google的演讲快要讲完了,接着就是陈榕的演讲,谈到了关于技…

model.train() model.eval() with torch.no_grad()

model.train() : 使得droupout 层起作用, 前相传播的时候会更新means 和var,而且会自动计算梯度 model.eval(): 会使得droupout 和前向传播的时候, droupout 不起作用, means 和var这样的统计数据值不会更新,但是依然…