Matlab多核CPU并行和多线程

这篇具有很好参考价值的文章主要介绍了Matlab多核CPU并行和多线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

这里需要明白的概念有:多核、多进程、多线程、并行计算、并发计算的区别。

什么是多核
在计算机设计早期,为了响应更多计算性能的需要,单处理器系统发展成为多处理器系统。更现代的、类似的系统设计趋势是将多个计算核放到单个芯片。无论多个计算核是在多个CPU芯片上还是在单个 CPU 芯片上,我们称之为多核或多处理器系统。

多进程
进程就是正在进行的一个程序或者任务,而负责执行任务的是CPU,执行任务的地方是内存。程序运行时的过程就是进程,同一个程序执行两次就是两个进程了。

并发与并行
并发和并行都是“同时”在工作,对于并发而言,是“伪并行”,即看起来是同时运行,其实是频繁更换CPU执行的程序代码,加之中间延迟很小,从我们的视角来看感觉就像是程序在同时运行;并行计算才是真正的同时计算,仅有多核才能是并行。

例子:你正在吃饭,电话响了
并发:放下筷子去接电话,接完电话然后继续吃饭
并行:一边接电话一边吃饭

并发: 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

并行: 当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
注意这里讨论的并行性和并发性的区别。并行系统可以同时执行多个任务。相比之下,并发系统支持多个任务,允许所有任务都能取得进展。因此,没有并行,并发也是可能的。

在 SMP 和多核架构出现之前,大多数计算机系统只有单个处理器。CPU 调度器通过快速切换系统内的进程,以便允许每个进程取得进展,从而提供并行假象。这些进程并发运行,而非并行运行。

随着系统线程数量从几十个到几千上万个,CPU 设计人员通过增加硬件来改善线程性能的提高系统性能。现代 Intel CPU 的每个核经常支持两个线程,而 Oracle T4 CPU 的每个核支持 8 个线程。这种支持意味着,可以将多个线程加载到处理核以便快速切换。毫无疑问,多核计算机将继续增加多核数量和硬件线程支持。

强烈注意: 多核,多cup,多机是不同的概念。

多线程编程提供机制,以便更有效地使用这些多个计算核和改进的并发性。考虑一个应用,它有 4 个线程。对于单核系统,并发仅仅意味着线程随着时间推移交错执行(图 1),因为处理核只能同一时间执行单个线程。
matlab多线程编程,面试,学习路线,阿里巴巴资料职业发展,matlab,java,数据库,后端
不过,对于多核系统,并发表示线程能够并行运行,因为系统可以为每个核分配一个单独线程(图 2)。
matlab多线程编程,面试,学习路线,阿里巴巴资料职业发展,matlab,java,数据库,后端
多进程是并行计算,多线程是并发计算。

线程与进程
线程: 是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位。
进程: 是资源分配的基本单位。一个进程包括多个线程。

区别

1.线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
2.每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。
3.不论是大小,开销线程要更“轻量级”
4.一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量)

多线程与多进程
多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。。。
多进程:同时执行多个程序。如,同事运行YY,QQ,以及各种浏览器。

基于Matlab实现多线程运算

这里通常大家的电脑都是多核电脑了,自然希望同时执行多个程序的运算任务,这里就简介一下如何实现。
获取电脑核数、CPU数和GPU数量,知己知彼,如果是单核,也就没有多大必要设置这些了。也可以通过进程管理器查看,几个子窗口就是几核。

% 检查GPU数量
ngpus=gpuDeviceCount;
disp([num2str(ngpus) ' GPUs found'])

% 检查核心数量
ncores=feature('numCores');
disp([num2str(ncores) ' cores found'])

% 检查电脑CPU数量
import java.lang.*;
r=Runtime.getRuntime;
ncpus=r.availableProcessors;
disp([num2str(ncpus) ' cpus found'])

如果我们想要执行不同的程序或代码,方法有:
方法1:开多个Matlab(最直接) 由于Matlab软件体量大,不是特别适合,如果有四五个任务要执行,开四五个或更多的Matlab有点不是很现实。
方法2:把不同的程序写成 function ,分配给不同的task
方法3:把不同的程序写成 function ,利用parfor实现

利用 Matlab 进行并行计算时,还需要说明几个概念:
job : 即Matlab待完成的任务,job由一组 task(作业)组成。
task : 并行计算的基本单元,分配到Matlab worker执行
scheduler :负责管理Matlab 提交的job, 分配 task 到每一个 worker
worker: 是指工作单元,数目一般小于等于 CPU的核数。lab是特殊的一个worker,lab之间可以进行数据通信。

例子1,官方例子:

t = createTask(j, F, N, {inputargs})
t = createTask(j, F, N, {C1,...,Cm})

首先创建一个工作,然后创建三个任务,三个任务都是调用rand函数生成随机数,三个任务的参数如后面的元包数组,要生成10x10 2x10 10x3的随机矩阵。

c = parcluster(); % Use default profile
j = createJob(c);
t = createTask(j, @rand, 1, {{10,10} {2,10} {10,3}});
submit(j);
wait(j);
taskoutput = fetchOutputs(j);
disp(taskoutput{1});
disp(taskoutput{2});
disp(taskoutput{3});

上述方法,也可以写成

c = parcluster(); % Use default profile
j = createJob(c);
createTask(j, @rand, 1, {10,10});
createTask(j, @rand, 1, {2,10});
createTask(j, @rand, 1, {10,3});
submit(j);
wait(j);
taskoutput = fetchOutputs(j);
disp(taskoutput{1});
disp(taskoutput{2});
disp(taskoutput{3});

还可以写成

c = parcluster(); % Use default profile
j = createJob(c);
pars = [10 10; 2 10; 10 3];
for i=1:3
	createTask(j, @rand, 1, {pars(i,1),pars(i,2)});
end
submit(j);
wait(j);
taskoutput = fetchOutputs(j);
disp(taskoutput{1});
disp(taskoutput{2});
disp(taskoutput{3});

方法2,假设有两个以及以上不同函数需要同时执行,即两个或以上任务需要不同函数来实现。

function state = myplot(x,y)
    plot(x,y)
    state = 1;
    print(gcf,'-dpng','-r300','myplot.png'])
end




function state = mytxt(A)

    filename = 'mytxt.txt';%文件路径 + 文件名
    file_id = fopen(filename,'a+');
    for jj = 1:length(A)
        fprintf(file_id,'%.4f
',A(jj));
    end
    fclose(file_id);
    state = 1;
end



par = 1:50;
x=-100:-1:100;
y = x.^2;

c = parcluster('local');
j = createJob(c); %开启一个job
createTask(j,@myplot,1,{x,y});
createTask(j,@mytxt,1,{par});
get(j,'Tasks')
submit(j);
wait(j);
taskoutput = fetchOutputs(j);
disp(taskoutput{1});

例子3,上面的任务太小,假设两个任务都需要耗费许多时间。这个例子增加一些时间消耗,运行需要约20秒,设置了每次循环暂停1秒。

function state = mytxt(id)
    file = fopen(['mytext_ ' num2str(id) '.txt'],'a+');
    for i = 1:20
        fprintf(file,'%.4f
',i);        
        pause(1)
    end
    fclose(file);
    state = 1; %函数状态
end



c = parcluster();
j = createJob(c);
createTask(j,@mytxt,1,{{1},{2},{3}});
get(j,'Tasks')
submit(j);
wait(j);
taskoutput = fetchOutputs(j);
disp(taskoutput{1}); 获取进程的状态
disp(taskoutput{2});
disp(taskoutput{3});

性能简单比较,通过时间

tic
for i=1:3
    mytxt(i)
end
toc

tic
c = parcluster();
j = createJob(c);
createTask(j,@mytxt,1,{{1},{2},{3}});
get(j,'Tasks')
submit(j);
wait(j);
taskoutput = fetchOutputs(j);
disp(taskoutput{1});
toc

matlab多线程编程,面试,学习路线,阿里巴巴资料职业发展,matlab,java,数据库,后端

matlab多线程编程,面试,学习路线,阿里巴巴资料职业发展,matlab,java,数据库,后端

matlab多线程编程,面试,学习路线,阿里巴巴资料职业发展,matlab,java,数据库,后端
方法3,此方法比较简单,使用方法如下,这个方法很简单且效率最高。

tic
parfor i=1:3
    mytxt(i)
end
toc


历时 20.123471 秒。

Parfor与createJob createTask的差异

差异1: createJob createTask启动和时间消耗都是比Parfor更高,如果对于长时间耗时的工作该差别不会太明显,但是对于测试阶段该区别显而易见。究其原因如下:使用createJob和createTask时,每个任务都在单独的MATLAB进程中运行,与parfor循环相比,这花费了更多的时间来启动。
差异2: parfor不可以嵌套循环,比如不可以:

parfor i=1:n
    parfor j=1:m
    	.....
    end
end

当然可以通过实现将参数设置好,通过单循环获取参数进行并行运算。经过实际测试还是推荐parfor,该过程可以输出中间过程,如果有错误会终止运行,而createtask无法输出中间过程。
差异3: parfor如果有一个并行运算崩溃有可能导致整个运算结束。而createJob createTask则不会,关掉matlab进程还在运行。这一点createJob createTask还是比较有用的。

Matlab无法开启并行Parallel运算解决方法

在Mac mini m1上,经过本人测试,如果2019未安装network license manager工具箱,就会导致无法进行并行运算,安装后即可。对于2020版本,不知道什么原因始终不可以开启。Windows以及其它IOS系统没有遇到过这种情况。

总结

多个进程执行完毕后,会自动释放其内存。由于理解等上述内容可能有错误,欢迎指出共同学习进步。

参考
https://www.cnblogs.com/purple5252/p/12957544.html
http://c.biancheng.net/view/1218.html
https://blog.csdn.net/weixin_44212633/article/details/111334042文章来源地址https://www.toymoban.com/news/detail-764607.html

到了这里,关于Matlab多核CPU并行和多线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多线程、协程和多进程并发编程

    37.1 如何通俗理解线程和进程? 进程:进程就是正在执⾏的程序。 线程:是程序执⾏的⼀条路径, ⼀个进程中可以包含多条线程。 通俗理解:例如你打开抖⾳,就是打开⼀个进程,在抖⾳⾥⾯和朋友聊天就是开启了⼀条线程。 再举⼀个例⼦: 在某⻝堂打饭的时候,此⻝堂安

    2024年02月02日
    浏览(99)
  • Python并行处理数据多进程/多线程,榨干你的CPU

      最近在公司实习,给整了个活,像是数学建模一样的数据分析的活,目标是在几个互相有关联的大表中找出满足某条件的那些业务,其中第一步就是把两个表拼起来,就叫它们A和B吧,省略拼表过程中需要的逻辑判断。   两个长为M和N的表,在判断中需要一个M*N级别的

    2024年02月15日
    浏览(54)
  • 【文末送书】Python高并发编程:探索异步IO和多线程并发

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜索关注公粽号 《机器和智能》 发送“刷题宝

    2024年02月15日
    浏览(44)
  • 【并行计算】多核处理器

    这张图连接了几个并行计算的思想。 从上往下。 1.两个fetch/decode部件,是 superscalar 技术,每个cycle可以发射多个指令。 2.多个执行单元,支持乱序执行,是ILP, 指令级并行 。 3.每个执行单元里还支持 SIMD 操作。 4.有多个execution context,就相当于是有多套线程的状态,类似寄

    2024年02月05日
    浏览(41)
  • Python中的线程池与进程池:并行编程的高效选择【第145篇—并行编程】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程中,实现并行处理任务是提高程序性能的关键。线程池和进程池是Python中常用的并行编程工具,它们能够有效地利用多核处理器的

    2024年04月08日
    浏览(73)
  • 科普:嵌入式多核并行仿真

    ​ 自信息技术革命以来,计算机一直被应用在各种复杂的数据处理中,如火箭弹道,高能物理和生物学数据等。随着嵌入式领域的多样化需求的不断丰富,多核CPU的应用也越来越广泛:嵌入式系统通常需要同时处理多个任务和实时数据,并在有限的资源和功耗限制下提供高性

    2024年02月03日
    浏览(38)
  • C# 消息队列、多线程、回滚、并行编程、异步编程、反射

    消息队列是一种在应用程序之间传递消息的异步通信机制。它可以使应用程序解耦并提高系统的可伸缩性和可靠性。在 C# 中,你可以使用多个消息队列技术,其中一种广泛使用的技术是 RabbitMQ。 RabbitMQ 是一个开源的消息代理,实现了高级消息队列协议(AMQP),提供了强大的

    2024年01月17日
    浏览(42)
  • MATLAB并行加速方法

    用MATLAB运行计算任务时,有时会遇到程序中有很多重复计算部分,多次循环中,每一次的计算之间无相互依赖(即后一次的计算不需要使用到前一次的计算结果),可能仅改变了输入参数,这时候如果串行计算效率十分低下,因此我们希望能够使用多线程进行加速。本文给大

    2024年02月03日
    浏览(34)
  • Matlab并行计算实践

    需要对上万张图像进行OCR识别。OCR算法原型用Matlab脚本实现,对每张图逐行逐字符识别,整体计算时间很长。找多核多CPU并行执行的方案 Matlab有并行工具箱。可以使用parfor对循环进行并行处理,parfor要求循环之间的运算独立不相关;另一种方式用SPMD模式,类似多线程/多进程方式

    2024年01月16日
    浏览(38)
  • C++ 多线程之OpenMP并行编程使用详解

    总结OpenMP使用详解 本文转载自:https://blog.csdn.net/AAAA202012/article/details/123665617?spm=1001.2014.3001.5506   OpenMP(Open Multi-Processing)是一种用于共享内存并行系统的多线程程序设计方案, 支持的编程语言包括C、C++和Fortran。 OpenMP提供了对并行算法的高层抽象描述, 通过线程实现并行化

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包