写在前面
本文整理自网上的博客加上,对程序进行了些简单的调试,和自己的一些思考,写的不太完善,也可能有些地方表达的不太准确,如果后续发现有问题再进行完善修改
加速的原理
图像在进行处理的时候可以进行分块加速,那么分块为什么可以加速,原来计算机里面是多核的,分块以后,使用计算机的多核同时并行处理,最后再把结果组合起来,就能达到加速的效果
加速的实现
MATLAB如何加速
matlab在计算大数据内存以及大矩阵运算时,提供多核运算的解决方案,Matlab的并行计算实质还是主从结构的分布式计算。当你初始化Matlab并行计算环境时,你最初的Matlab进程自动成为主节点,同时初始化多个Matlab计算子节点
如何查看电脑的核的数目
首先检查电脑有几个核:在快速启动工具栏上点右键,选择“启动任务管理器”,或者在开始-运行中输入“taskmgr”,启动任务管理器。点性能选项卡,可以看到CPU使用记录,右上角有几个框就代表有几个核心。当然还有其他方法,如需了解请点参考2
关于内核
CPU(Central Processing Unit): 中央处理单元,CPU != 物理核,更 != 逻辑核。
物理核(physical core/processor): 可以看的到的,真实的cpu核,有独立的电路元件以及L1,L2缓存,可以独立地执行指令。
逻辑核(logical core/processor): 在同一个物理核内,逻辑层面的核。(比喻,像动画片一样,我们看到的“动画”,其实是一帧一帧静态的画面,24帧/s连起来就骗过了人类的眼睛,看起来像动起来一样。逻辑核也一样,物理核通过高速运算,让应用程序以为有两个cpu在运算)。
关系:通常所说的核是指的逻辑核
MATLAB测试
明白了核的概念以后,我们来在MATLAB上检测一下:
我们可以通过matlabpool命令来启动和配置Matlab并行计算池,但是较高版本的MATLAB会出现“未定义函数或变量 ‘matlabpool’”的错误,而采用了parpool命令来代替
在mathwork中我们可以对parpool进行检索,点击右边的translate可以将网页翻译成中文
使用本地配置文件启动由2名工作人员组成的并行池。
parpool('local',2)
查找当前并行池中的工作人员数。
poolobj = gcp('nocreate'); % If no pool, do not create new one.
if isempty(poolobj)
poolsize = 0;
else
poolsize = poolobj.NumWorkers
end
关于关闭
使用默认配置文件创建并行池, 然后删除该池。
poolobj = parpool;
delete(poolobj)
装配成函数如下:
function [] = closematlabpool
poolobj = gcp('nocreate');
delete(poolobj);
end
也可以直接
delete(gcp('nocreate'))
更详细的内容请参考资料5
各博客的案例
案例1:
%% 启动并行计算
core_number=2; %想要调用的处理器个数
parpool('local',core_number);
% % % % % % 启动后有如下提示:
% Starting parallel pool (parpool) using the 'local' profile ...
% connected to 2 workers.
%% 算例(没有实际意义,甚至很奇怪的例子)
temp = [];
for j = 1:100
for i = 1:10
x = i + j;
temp(i) = x;
end
% y = x + 1;
%x是临时变量,不能在parfor循环外使用
y = temp .^ 2;
%temp是sliced变量(基本就是向量),可以在parfor循环外使用 end
%% 关闭并行计算 delete(gcp('nocreate'));
% % % % % 关闭后有如下提示:
% Parallel pool using the 'local' profile is shutting down.
案例2:
最好的方法是这样:
for k=1:M*N
i=mod(k-1,M)+1 %行号
j=floor((k-1)/M)+1 %列号
end
Note:
- Matlab启动并行环境是比较慢的,不过不用每次都重新启动环境,启动一次以后能一直使用
- parfor循环中的临时变量不能在循环外使用且每次parfor迭代后临时变量都会自动清除
- parfor使用时机:每次循环相互独立,且数据量较大
- parfor只能用在单循环当中
图像分块
clc; clear all; close all;
I = imread('lena.jpg');
height= size(I, 1); %求出行
width = size(I, 2); %求出列
region_size = 256; %区域宽高大小
numRow = round(height/region_size);%图像在垂直方向能分成多少个大小为region_size
numCol = round(width/region_size);%图像在水平方向能分成多少个大小为region_size
I=imresize(I,[numRow*region_size,numCol*region_size]);%重新生成新的图像,以防止temp下标越界
t1 = (0:numRow-1)*region_size + 1; t2 = (1:numRow)*region_size;
t3 = (0:numCol-1)*region_size + 1; t4 = (1:numCol)*region_size;
figure;
k = 0;
for i = 1 : numRow
for j = 1 : numCol
temp = I(t1(i):t2(i), t3(j):t4(j), :);
k = k + 1;
subplot(numRow, numCol, k);
imshow(temp);
end
end
特征值进行合并
最后把图像的各部分进行组合
end
参考
1、如何利用MATLAB并行计算缩短程序运行时间
2、如何查看电脑CPU的核心个数
3、CPU、物理核、逻辑核概念与关系
4、matlab并行一 配置matlab并行计算池
5、在mathwork中查parpool的用法
6、Matlab使用:多核并行计算
7、Matlab 并行计算学习初步
8、matlab并行一 配置matlab并行计算池
9、matlab并行之parafor
10、MATLAB与图像处理(三):图像分成块