的核數和程序 MATLAB平行計算之多程序連續濾波

2021-10-14 21:50:00 字數 3203 閱讀 5711

為了提高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等都是支援多工的作業系統,所謂的多工就是作業系統可以執行同時執行多個任務。作業系統的任務排程就是採用時間片輪換的搶占式排程方式,也就是說乙個任務執行一小段時間後強制暫停去執行下乙個任務,每個任務輪流執行。任務執行的一小段時...