為了提高matalb的濾波效率,採用了spmd平行計算來提高濾波速度。針對大資料分塊後濾波的不連續問題,每次分段濾波時,設定每段overlap值等於濾波器中暫存器的個數。
下面直接上**。
function multiprocessfilter(objfilter,rawfile,processfile,m)
% 實現本地檔案資料讀取、多程序連續濾波、濾波後訊號寫入
% objfilter 1×1 dffir fir濾波器物件
% rawfile 1×n char 待濾波的二進位制檔案(int8)名稱
% processfile 1×m char 濾波後的二進位制檔案(int8)名稱
% m 1×1 double 程序數目,小於等於cpu核數
% fir濾波器中暫存器個數
overlap = length(objfilter.states);
% 開啟要濾波的檔案
fidread = fopen(rawfile,'rb');
fidwrite = fopen(processfile,'wb');
% 預處理一小段資料
predata = fread(fidread,overlap,'int8=>int8');
prefilterdata = filter(objfilter,predata);
fwrite(fidwrite,prefilterdata,'int8');
while(~feof(fidread))
% 檔案讀取不能多程序
fseek(fidread,- overlap,'cof');
[data,count] = fread(fidread,m*1e8 + overlap,'int8=>int8');
workload = round((count - overlap)/m);
% 多程序濾波
spmd(m)
id = labindex;
if isequal(id,1)
fdata = filter(objfilter,data(1:workload+overlap));
fdata = int8(fdata(overlap+1:end));
elseif isequal(id,m)
fdata = filter(objfilter,data((m-1)*workload+1 : end));
fdata = int8(fdata(overlap+1:end));
else
fdata = filter(objfilter,data((id-1)*workload+1: id*workload+overlap));
fdata = int8(fdata(overlap+1:end));
endend
% 檔案寫入不能多程序操作
for ii = 1:m
fwrite(fidwrite,fdata,'int8');
endend% 關閉檔案
fclose('all');
end
作為對比,下面是單程序濾波的**
function singleprocessfilter(objfilter,rawfile,processfile)
% persistentmemory設為1,保持連續濾波
objfilter.persistentmemory = 1;
fidread = fopen(rawfile,'rb');
fidwrite = fopen(processfile,'wb');
while(~feof(fidread))
data = fread(fidread,1e8,'int8=>int8');
fdata = filter(objfilter,data);
fwrite(fidwrite,int8(fdata),'int8');
endfclose('all');
end
測試,比較單程序與多程序濾波的執行時間,並二進位制比較濾波後的輸出檔案是否相同。
function main()
% 68階等紋波濾波器
objfilter = lowpassfilter;
% 單程序濾波
tic;singleprocessfilter(objfilter,'raw.bin','single.bin');toc
% 時間已過 138.555783 秒。
% parpool(6)
% 6程序濾波
tic;multiprocessfilter(objfilter,'raw.bin','multi.bin',6);toc
% 時間已過 46.245316 秒。
% 比較濾波結果
visdiff('single.bin','multi.bin','binary')
% 這些檔案相同
endfunction hd = lowpassfilter
fpass = 0.2; % passband frequency
fstop = 0.25; % stopband frequency
dpass = 0.057501127785; % passband ripple
dstop = 0.0031622776602; % stopband attenuation
dens = 20; % density factor
[n, fo, ao, w] = firpmord([fpass, fstop], [1 0], [dpass, dstop]);
b = firpm(n, fo, ao, w, );
hd = dfilt.dffir(b);
% set(hd, 'arithmetic', 'single');
end
測試結果表明,使用68階fir濾波器對1.2g的int8檔案進行濾波,單程序需要138秒,6程序需要46秒,花費的時間約為1/3。(之所以不是1/6,是因為檔案讀取與寫入是單程序的。)
上述**的測試環境為matlab r2019a,intel i7 8700 4.3ghz, 6核6執行緒(關閉了超執行緒),記憶體32g。
易夕:matlab tricks 專欄目錄zhuanlan.zhihu.com
程序的並行和併發
目錄並行 並行是指兩者同時執行,比如賽跑,兩個人都在不停的往前跑 資源夠用,比如三個執行緒,四核的cpu 併發 併發是指資源有限的情況下,兩者交替輪流使用資源,比如一段路 單核cpu資源 同時只能過乙個人,a走一段後,讓給b,b用完繼續給a 交替使用,目的是提高效率。並行是從微觀上,也就是在乙個精確...
CPU 核數和執行緒數的關係
cpu 處理器。核心數cpu的大腦數量。核心數就跟人的大腦一樣,比如說,核心數2就說明cpu有兩個腦子,腦子越多解決問題的速度越快。cpu的核心數越高,處理速度就越高。核心數2通俗地說就是雙核cpu。執行緒數乙個核心就是乙個物理執行緒,核心數2就有兩個物理執行緒。但是,因特爾的超執行緒技術可以把乙個...
程序的並行和併發以及上下文。
一 程序的初步認識二 時間片的概念 現代作業系統,如linux,windows等都是支援多工的作業系統,所謂的多工就是作業系統可以執行同時執行多個任務。作業系統的任務排程就是採用時間片輪換的搶占式排程方式,也就是說乙個任務執行一小段時間後強制暫停去執行下乙個任務,每個任務輪流執行。任務執行的一小段時...