Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ
îðèãèíàëüíîãî äîêóìåíòà
: http://fpga.parallel.ru/fft/
Äàòà èçìåíåíèÿ: Tue Aug 16 14:34:34 2011 Äàòà èíäåêñèðîâàíèÿ: Mon Oct 1 19:52:10 2012 Êîäèðîâêà: koi8-r |
ÊÎÌÏÜÞÒÅÐÛ |
Ñîñòàâíîé ÷àñòüþ ðåøåíèÿ ìíîãèõ ïðèêëàäíûõ çàäà÷ ÿâëÿåòñÿ îñóùåñòâëåíèå ïðÿìîãî è îáðàòíîãî äèñêðåòíûõ ïðåîáðàçîâàíèé Ôóðüå. Ýòà ïîäçàäà÷à âñòðå÷àåòñÿ â òàêèõ ïðèëîæåíèÿõ, êàê îáðàáîòêà ñèãíàëîâ, ðåøåíèå ýëëèïòè÷åñêèõ çàäà÷ ìàòåìàòè÷åñêîé ôèçèêè, ðåøåíèå ñèñòåì ëèíåéíûõ àëãåáðàè÷åñêèõ óðàâíåíèé ñïåöèàëüíîãî âèäà è ò.ä. Çäåñü ìû ðàññìîòðèì, ÷òî ýòî çà ïðåîáðàçîâàíèå è êàê åãî ìîæíî âûïîëíèòü áûñòðåå.
Ïóñòü f = (f0, ... ,fN-1)T - èñõîäíûé âåêòîð, êîòîðûé íóæíî óìíîæèòü íà ìàòðèöó Ôóðüå F c ýëåìåíòàìè
äëÿ ïîëó÷åíèÿ âåêòîðà a= (a0, ..., aN-1)T ïî ôîðìóëå a = Ff. Òîãäà äëÿ ýëåìåíòà èñêîìîãî âåêòîðà óìíîæåíèå äàñò ôîðìóëó:
Êàê èçâåñòíî, â îáùåì ñëó÷àå óìíîæåíèå ìàòðèöû íàì âåêòîð òðåáóåò O(N2) àðèôìåòè÷åñêèõ îïåðàöèé. Ñëåäóåò ðàññìîòðåòü âîïðîñ î ñîêðàùåíèè ýòîãî ÷èñëà.
1Âîîáùå ãîâîðÿ, â ôîðìóëàõ ÄÏÔ äëÿ ôèçè÷åñêîé êîððåêòíîñòè ÷àñòî ïðèñóòñòâóåò è íîðìèðîâî÷íûé ìíîæèòåëü, êîòîðîãî ó íàñ íåò. Çäåñü ìû áóäåì èñïîëüçîâàòü òåðìèíîëîãèþ, ïðèíÿòóþ â § 17 ñïðàâî÷íèêà Â.Â.Âîåâîäèíà è Þ.À.Êóçíåöîâà "Ìàòðèöû è âû÷èñëåíèÿ" (Ì., Íàóêà, 1984ã.). Òåîðåòè÷åñêèå îöåíêè, ïðèâîäèìûå íèæå, âçÿòû òîæå îòòóäà.
Ðàññìîòðèì ñòðóêòóðó âû÷èñëåíèé êëàññè÷åñêîãî ÄÏÔ, ïðåäïîëîæèâ, ÷òî ñóììèðîâàíèå ïðîèñõîäèò ïî ïîðÿäêó îò ìàëûõ çíà÷åíèé èíäåêñîâ ê áîëüøèì. Êàçàëîñü áû, ÷òî ñëîæíîãî â áàíàëüíîì óìíîæåíèè ìàòðèöû íà âåêòîð? Îäíàêî, â îòëè÷èå îò ñòàíäàðòíîãî óìíîæåíèÿ, ãäå êàæäûé ýëåìåíò ìàòðèöû èñïîëüçóåòñÿ òîëüêî îäèí ðàç, â ÄÏÔ ìàòðèöà - ñïåöèàëüíîãî âèäà. Ýòî ïðèâîäèò ê òîìó, ÷òî îäíè è òå æå ýëåìåíòû ìàòðèöû èñïîëüçóþòñÿ â ñîâåðøåííî ðàçíûõ ìåñòàõ ñõåìû âû÷èñëåíèé. Íà ðèñóíêå ïðåäñòàâëåíà ñòðóêòóðà ÄÏÔ ñ N=6.
׸ðíûìè ëèíèÿìè îáîçíà÷åíû ñîáñòâåííî âåòâè âû÷èñëåíèé, ïðè ýòîì ïåðåäà÷è îñóùåñòâëÿþòñÿ ñëåâà íàïðàâî, â êðàéíåì ñïðàâà ñòîëáöå ðåçóëüòàòîì áóäåò ñîîòâåòñòâóþùèé ýëåìåíò âû÷èñëÿåìîãî âåêòîðà.  îäíîì ñòîëáöå ðàñïîëîæåíû òå îïåðàöèè, êîòîðûå èñïîëüçóþò â êà÷åñòâå îäíîãî èç äàííûõ îäèí è òîò æå ýëåìåíò èñõîäíîãî âåêòîðà. À âîò öâåò âåðøèíû (âñå îíè ñîîòâåòñòâóþò îïåðàöèè a+bc) ñîîòâåòñòâóåò òîìó, êàêîé èç ýëåìåíòîâ ìàòðèöû Ôóðüå óìíîæàåòñÿ íà ýëåìåíò èñõîäíîãî âåêòîðà. Ñåðûì öâåòîì îêðàøåíû âåðøèíû, ãäå èç ìàòðèöû Ôóðüå â êà÷åñòâå ìíîæèòåëÿ áåð¸òñÿ íóëåâàÿ ñòåïåíü êîìïëåêñíîãî ÷èñëà, ò.å. ïðîñòî åäèíèöà (è ãäå, ñëåäîâàòåëüíî, óìíîæåíèå ìîæíî ïðîïóñòèòü). Êàê âèäèì, å¸ êàê ðàç áîëüøå âñåãî â ñòðóêòóðå âû÷èñëåíèé. Äàëåå ñòåïåíè îäíîãî è òîãî æå êîìïëåêñíîãî ìíîæèòåëÿ ðàñòóò îò 1 äî 5 â âåðøèíàõ ñîîòâåòñòâåííî çåë¸íîãî, ãîëóáîãî, ñèíåãî (ýëåìåíò òàì óìíîæàåòñÿ íà -1 è ïîòîìó ìîæíî, êàê è â ñåðûõ âåðøèíàõ, îòêàçàòüñÿ îò óìíîæåíèÿ, çàìåíèâ ñëîæåíèå âû÷èòàíèåì), ôèîëåòîâîãî è æ¸ëòîãî öâåòîâ. Êàê âèäíî, ñòðóêòóðà èñïîëüçîâàíèÿ ýòèõ ñòåïåíåé äîâîëüíî "õàîòè÷íà", õîòÿ íà ñàìîì äåëå â ýòîì "õàîñå" åñòü ñòðîãî îïðåäåë¸ííûé ïîðÿäîê.
 ñëó÷àå ïðîñòîãî N ñòðóêòóðà áóäåò îòëè÷àòüñÿ òåì, ÷òî "ñåðûõ" âåðøèí, êðîìå êàê íà ëåâîé è âåðõíåé ãðàíèöàõ ñîîòâåòñòâóþùåãî ðèñóíêà, áîëüøå íå áóäåò âîîáùå.
 ñëó÷àå æå N=2 ó íàñ áóäóò òîëüêî 3 ñëîæåíèÿ è îäíî âû÷èòàíèå, òàê ÷òî èñïîëüçîâàíèå äâîéêè â êà÷åñòâå áàçîâîãî ñîìíîæèòåëÿ ÁÏÔ íåñ¸ò íåñîìíåííûå âûãîäû.
Ñòðóêòóðà êëàññè÷åñêîãî ÄÏÔ â öåëîì íàñòîëüêî ïðîñòà, ÷òî å¸ ìîæíî çàïèñàòü ñ ïîìîùüþ òàêîé ïðîñòîé ôîðòðàí-ïîäïðîãðàììû:
subroutine ft(f,a,w,N)
ñ
c ïàðàìåòðû âûáðàíû ñ òåìè æå èäåíòèôèêàòîðàìè, ÷òî èñïîëüçóþòñÿ â ïîñòàíîâêå çàäà÷è
c w - ìàññèâ ìíîæèòåëåé (íóëåâîé íå õðàíèòñÿ, òàê êàê îí ðàâåí 1)
ñ
complex f(0:N-1),a(0:N-1),w(N-1)
DO 10 i = 0, N-1
10 a (i) = f (0)
c
c èíèöèàëèçàöèÿ ñóìì
c
DO 20 j = 1, N-1
20 a (0) = a (0) + f (j)
c
c âû÷èñëåíèå íóëåâîãî ýëåìåíòà èñïîëüçóåò â êà÷åñòâå ìíîæèòåëåé òîëüêî 1
ñ
DO 30 i = 1, N-1
DO 30 j = 1, N-1
jj = MOD (i*j, N)
c
c âû÷èñëåíèå íîìåðà êîìïëåêñíîãî ìíîæèòåëÿ
c
if (jj .eq. 0) then
a (i) = a (i) + f (j)
c
c óìíîæàòü íà 1 íå íóæíî
c
else if (2*jj .eq. N) then
a (i) = a (i) - f (j)
c
c íà -1 óìíîæàòü òîæå íå íóæíî
c
else
a (i) = a(i) + f (j) * w (jj)
end if
30 CONTINUE
RETURN
END
(ïðîãðàììà çàïèñàíà â íîòàöèè Ôîðòðàíà 77).
Ðàññìîòðèì ñëó÷àé N = p1 p2, ïðè÷¸ì ñîìíîæèòåëè íå ðàâíû 1. Òîãäà, ïðåäñòàâèì èíäåêñû ýëåìåíòîâ âåêòîðîâ è ìàòðèöû q, j â âèäå
è ïîäñòàâèì èõ â èñõîäíóþ ôîðìóëó äëÿ ýëåìåíòà èñêîìîãî âåêòîðà. Òîãäà ïîñëå íåñëîæíûõ àðèôìåòè÷åñêèõ ïðåîáðàçîâàíèé, ó÷èòûâàÿ òî, ÷òî
è òî, ÷òî ìíèìàÿ ýêñïîíåíòà ïåðèîäè÷íà ñ ïåðèîäîì 2π, ïîëó÷èì, ÷òî
ãäå
Ïðè âû÷èñëåíèè ïî ïðåäñòàâëåííîìó àëãîðèòìó òðåáóåòñÿ âñåãî
àðèôìåòè÷åñêèõ îïåðàöèé.  ñëó÷àå, êîãäà ñîìíîæèòåëè ðàâíû äðóã äðóãó, îáùåå êîëè÷åñòâî îïåðàöèé ñîñòàâèò
Îïèñàííûé àëãîðèòì è íîñèò íàçâàíèå "Áûñòðîå ïðåîáðàçîâàíèå Ôóðüå".
Ïðèâåä¸ííûå âûøå ôîðìóëû ïîêàçûâàþò èíòåðåñíóþ âåùü. Îêàçûâàåòñÿ, åñëè çàïèñàòü èñõîäíûé âåêòîð f ïî ñòîëáöàì ïðÿìîóãîëüíîé òàáëèöû ðàçìåðà p2 íà p1, òî åãî ïðåîáðàçîâàíèå Ôóðüå â âåêòîð a ìîæåò áûòü âûïîëíåíî â ñëåäóþùèå òðè äåéñòâèÿ (íà ðèñóíêàõ-ïðèìåðàõ ìû áóäåì ñ÷èòàòü, ÷òî èñõîäíàÿ ðàçìåðíîñòü ðàâíà 15):
Èñêîìûé âåêòîð a áóäåò â ïîëó÷èâøåéñÿ òàáëèöå çàïèñàí ïî ñòðîêàì. Åñëè æå ìû õîòèì, ÷òîáû îí òîæå áûë çàïèñàí ïî ñòîëáöàì, êàê è èñõîäíûé, òî íàì íàäî áóäåò äîáàâèòü ÷åòâ¸ðòîå äåéñòâèå - òðàíñïîíèðîâàíèå òàáëèöû.
Óêàçàííàÿ îñîáåííîñòü - îñíîâíûìè äåéñòâèÿìè ÿâëÿþòñÿ òå æå ïðåîáðàçîâàíèÿ Ôóðüå, íî ìåíüøåé ðàçìåðíîñòè - ïîçâîëÿåò ïðèìåíèòü ïðè¸ì ÁÏÔ è ê íèì, â òîì ñëó÷àå, åñëè ñîìíîæèòåëè, îáðàçóþùèå ñîñòàâíîå N, ñàìè îêàæóòñÿ ñîñòàâíûìè. Ðàçðàáîòàíî ìíîãî ïðîãðàìì, êîòîðûå äîâîäÿò ðàçëîæåíèå äî ïðîñòûõ äåëèòåëåé ÷èñëà N. Èõ äåòàëüíûé ðàçáîð ìîæíî ïðî÷èòàòü, íàïðèìåð â èçâåñòíîé êíèãå Áëåéõóòà. Ñàìûå èçâåñòíûå èç íèõ, îäíàêî, ïîëó÷àþòñÿ â ñëåäóþùåì ÷àñòíîì ñëó÷àå.
Ïóñòü N = 2k. Òîãäà âûøåèçëîæåííóþ ñõåìó ñâåäåíèÿ ïðåîáðàçîâàíèÿ Ôóðüå ê ïðåîáðàçîâàíèÿì ìåíüøåé ðàçìåðíîñòè ìîæíî âûïîëíèòü îñîáåííî ýôôåêòèâíî. Ýòîìó ñïîñîáñòâóþò ñëåäóþùèå ïðè÷èíû:
Îáùàÿ ñòðóêòóðà îäíîãî øàãà ÁÏÔ (áåç ó÷¸òà
òðàíñïîíèðîâàíèé, íî ñ ó÷¸òîì óìíîæåíèé íà ïîâîðà÷èâàþùèå ìíîæèòåëè)
äëÿ N = 2k äà¸ò íàì ðèñóíîê òàêîãî âèäà:
Êðàñíûìè ëèíèÿìè îáîçíà÷åíà ïåðåäà÷à íà÷àëüíûõ äàííûõ (ìàññèâà èç
2+1 ïàð äåéñòâèòåëüíûõ ÷èñåë, êàæäàÿ ïàðà - äåéñòâèòåëüíàÿ è ìíèìàÿ
÷àñòü
ñîîòâåòñòâóþùèõ êîìïëåêñíûõ ÷èñåë). Äàëåå ìû ââåðõó âèäèì ïðîñòóþ
çàïèñü ðåçóëüòàòîâ, à âíèçó - ñòðóêòóðó ñ óìíîæåíèåì íà ïîâîðà÷èâàþùèé
ìíîæèòåëü, íå ðàâíûé 1. Çåë¸íûìè ñòðåëêàìè îáîçíà÷åíà
çàïèñü äàííûõ â ìàññèâ (è çäåñü ìû âèäèì â ñåðåäèíå ñòðóêòóðó,
çàìåíèâøóþ òðàíñïîíèðîâàíèå ìàòðèöû 2õ2). Êâàäðàòàìè æå îáîçíà÷åíû
ýëåìåíòû ìàññèâà (êðàñíûìè - íà÷àëüíûå äàííûå øàãà ÁÏÔ, çåë¸íûìè -
âû÷èñëåííîå ïîäïðîãðàììîé èõ ÄÏÔ ñ óìíîæåíèåì íà ìíîæèòåëè, ðîçîâûìè -
ïîâîðà÷èâàþùèé ìíîæèòåëü).
Ïðèâåä¸ì òåïåðü îáùóþ âû÷èñëèòåëüíóþ ñòðóêòóðó,
õàðàêòåðíóþ äëÿ ñëó÷àÿ, êîãäà ðàçìåðíîñòü ÄÏÔ - ñòåïåíü äâîéêè. Äàæå
ïðè ïîñëåäîâàòåëüíî-ðåêóððåíòíîé îðãàíèçàöèè ðàçáèåíèÿ N ïîïîëàì íà ÄÏÔ
ìåíüøåé ðàçìåðíîñòè óæå åñòü äâà âàðèàíòà, îïèñàííûõ ó Áëåéõóòà
(êîãäà äâîéêîé ÿâëÿåòñÿ êîëè÷åñòâî ñòðîê â ðàçáèåíèè
âûøå, à äàëüíåéøåìó ðàçáèåíèþ ïîïîëàì ïîäâåðãàþòñÿ ñòîëáöû, èëè æå
íàîáîðîò, äâîéêà - êîëè÷åñòâî ñòîëáöîâ, à äàëüøå ðàçáèâàþòñÿ ñòðîêè),
èìåþùèå îáùåïðèíÿòûå äëÿ "ñèãíàëüùèêîâ" íàçâàíèÿ - "ñ ïðîðåæèâàíèåì ïî
÷àñòîòå" èëè æå "ñ ïðîðåæèâàíèåì ïî âðåìåíè" . Îíè, îäíàêî, áëèçêè ïî
ñòðóêòóðå äðóã ê äðóãó:
Íà ðèñóíêå - îáùàÿ ñòðóêòóðíàÿ ñõåìà ÁÏÔ äëÿ N=16. Çåë¸íûå âåðøèíû ñîîòâåòñòâóþò âûïîëíÿåìûì ìàêðîîïåðàöèÿì, îïèñàííûì âûøå. Ïåðåäà÷à äàííûõ ïîêàçàíà ÷¸ðíûìè è ñèíèìè ñòðåëêàìè. ßðóñû ïàðàëëåëüíîé ôîðìû ìàêðîãðàôà ÁÏÔ ðàñïîëîæåíû ïî âåðòèêàëÿì. Åñëè âñ¸ äåëàòü òàêèì îáðàçîì, ïðè âûïîëíåíèè ÁÏÔ äëÿ N = 2k èçâåñòíî, ÷òî îíî ìîæåò áûòü ðåàëèçîâàíî çà N log2N / 2 îïåðàöèé êîìïëåêñíîãî óìíîæåíèÿ è N log2N îïåðàöèé êîìïëåêñíîãî ñëîæåíèÿ.
Çäåñü ìû ñïåöèàëüíî íå ïðèâîäèì îöåíêè ÷åðåç äåéñòâèòåëüíûå óìíîæåíèÿ è ñëîæåíèÿ, ïîñêîëüêó äëÿ ñàìèõ êîìïëåêñíûõ óìíîæåíèé åñòü ðàçíûå ðåàëèçàöèè - êàê îáû÷íàÿ (÷åðåç 4 óìíîæåíèÿ è 2 ñëîæåíèÿ), òàê è "áûñòðàÿ" (÷åðåç 3 óìíîæåíèÿ è 3 ñëîæåíèÿ).
Êàê âèäíî èç ðèñóíêà, ñòðóêòóðà ïåðåñûëîê íåëèíåéíàÿ, îíà ýêñïîíåíöèàëüíî çàâèñèò îò íîìåðà øàãà ÁÏÔ. Îäíàêî ïðè ïðàâèëüíîé îðãàíèçàöèè ñî÷åòàíèÿ òðàíñïîíèðîâàíèé ñòðóêòóðà ïåðåñûëîê áóäåò íåèçìåííîé îò øàãà ê øàãó ÁÏÔ. Ïëàòîé çà ýòî áóäåò, îäíàêî, òî, ÷òî ïîëîâèíà äóã áóäåò ïðèíàäëåæàòü ê êëàññó äëèííûõ, ò.å. ïåðåäà÷à äàííûõ íå áóäåò ëîêàëüíîé, à òàêæå òî, ÷òî ïðåäâàðèòåëüíî äàííûå íàäî áóäåò ðàñïîëîæèòü â òàê íàçûâàåìîì áèòèíâåðñèâíîì ïîðÿäêå (òî åñòü â òàêîì, ãäå äâîè÷íîå ïðåäñòàâëåíèå èíäåêñà ìàññèâà èä¸ò íàîáîðîò). Ýòà ïîäçàäà÷à (íà÷àëüíîé ïåðåñîðòèðîâêè) çàíèìàåò ïðèìåðíî N ïåðåñûëîê äàííûõ, íî ñëîæíà ëîãè÷åñêè, ïîýòîìó å¸ ðåøåíèå ìû çäåñü ïðèâîäèòü íå áóäåì.
Äëÿ ðåàëèçàöèè íà ÏËÈÑàõ åñòü ïðèìåð ôðàãìåíòà ïðîãðàììû íà ÿçûêå Colamo, èñïîëüçóþùåé ÁÏÔ (ìåòîä Êóëè-Òüþêè äëÿ ïðîèçâîëüíîé ñòåïåíè äâîéêè) ïðÿìîóãîëüíîãî ìàññèâà ðàçìåðà 1024õ1024 ïî ñòðîêàì, ðàçðàáîòàííûé â ÍÈÈ ÌÂÑ ïðè ÒÐÒÓ. Âîò å¸ òåêñò (ìû áóäåì ïåðèîäè÷åñêè âñòàâëÿòü ñâîè ïîÿñíåíèÿ):
Include MyLibNewElement;
var ReX_in, ImX_in, ReX_out, ImX_out: Array real [1024:Stream, 1024:Stream] Mem;
// Âõîäíîé è âûõîäíîé ìàññèâ ñòðîêè, ñòîëáöû
var ReX_in_com, ImX_in_com: Array real [1024:Stream, 1024:Stream, 10: Stream] Com;
// Âõîäíîé è âûõîäíîé ìàññèâ ñòðîêè, ñòîëáöû, èòåðàöèè
var invert: Array integer [10: Stream,512: Stream] mem;
// ìàññèâ ñ àäðåñàìè â áèòèíâåðñèâíîì ïîðÿäêå
Âèäíî, ÷òî äàííûå èçíà÷àëüíî óæå ðàñïîëîæåíû â òàê íàçûâàåìîì áèòèíâåðñèâíîì ïîðÿäêå, òàê ÷òî ðàçðàáîò÷èêè ïðîãðàììû äëÿ ÏËÈÑ ñëîæíóþ ëîãèêó ýòîãî ïåðåóïîðÿäî÷èâàíèÿ ìàññèâà îñòàâèëè äëÿ ðàáîòû íà âíåøíåì õîñò-êîìïüþòåðå ïåðåä âûçîâîì ÏËÈÑ-ìîäóëÿ.
var N,i,j,k,m,p : Number;
var ReImW : Array real [512:Stream] Mem;
// ìàññèâ êîýôôèöèåíòîâ ÁÏÔ
var ReA_reg, ImA_reg, ReB_reg, ImB_reg : real Reg;
// ìàññèâ êîýôôèöèåíòîâ ÁÏÔ
var ReA_com, ImA_com, ReB_com, ImB_com : real com;
// ìàññèâ êîýôôèöèåíòîâ ÁÏÔ
Çäåñü âèäíî, ÷òî è âû÷èñëåíèå òðèãîíîìåòðèè òîæå îñòàâëåíî íà ïðåäâàðèòåëüíóþ ðàáîòó õîñò-êîìïüþòåðà.
Define N=1024;
ReadFile (inv, FF_Int_64, "inv.txt");
// ÷òåíèå èç ôàéëà ìàññèâà ñ àäðåñàìè â áèòèíâåðñèâíîì ïîðÿäêå
ReadFile (ReImW, FF_Int_64, "ReImW.txt");
// ÷òåíèå èç ôàéëà ìàññèâà êîýôôèöèåíòîâ
ReadFile (AB, FF_Int_64, "In_com.txt");
// ÷òåíèå èç ôàéëà ìàññèâà êîýôôèöèåíòîâ
Íà÷àëî îïèñàíèÿ ñòðóêòóðû îñíîâíîé îïåðàöèè (òàê íàçûâàåìàÿ "áàáî÷êà" ÁÏÔ):
let But_FFT(in: ReA, ImA, ReB, ImB, ReW, ImW;
// âõîäíûå äàííûå
out: ReA_out, ImA_out, ReB_out, ImB_out);
// âûõîäíûå äàííûå
var ReA, ImA, ReB, ImB, ReA_out, ImA_out, ReB_out, ImB_out, ReW, ImW: real com;
var Re_C, Im_C: real com;
// Ìàññèâ êîììóò. ïåðåìåííûõ ñîîòâ. ñòðóêòóðå ÁÏÔ
var mul_1, mul_2, mul_3, mul_4: real com;
// Ìàññèâ êîììóò. ïåðåìåííûõ ñîîòâ. ñòðóêòóðå ÁÏÔ
ReA_out := ReA + ReB;
ImA_out := ImA + ImB;
Re_C := ReA - ReB;
Im_C := ImA - ImB;
Mul_1 := Re_C*ReW;
Mul_2 := Im_C*ImW;
Mul_3 := Im_C*ReW;
Mul_4 := Re_C*ImW;
ReB_out := Mul_1 - Mul_2;
ImB_out := Mul_3 + Mul_4;
EndLet;
Âèäíî, ÷òî êëþ÷åâàÿ ñòðóêòóðà But_FFT ðåàëèçóåò èìåííî ñòðóêòóðó îäíîãî øàãà ÁÏÔ, êîòîðóþ ìû âèäåëè âûøå. Äàëåå ñëåäóåò ÁÏÔ ñòðîê èçîáðàæåíèÿ:
CADR Gor_FFT;
// Êàäð âû÷èñëåíèÿ ñïåêòðà ñòðîê èçëáðàæåíèÿ
for m := 0 to 2 do
begin
if m = 0 then
// ïåðåäà÷à âõîäíûõ äàííûõ com - ïåðåìåííûì
begin
for i := 0 to 1024 - 1 do
// öèêë ïî ñòðîêàì
begin
for j := 0 to 1024 - 1 do
// öèêë ïî ñòðîêàì
begin
ReX_in_com[i, j, 0] := ReX_in[i, j];
ImX_in_com[i, j, 0] := ImX_in[i, j];
end;
end;
end
Çäåñü âèäíî, ÷òî äàííûå è ðåçóëüòàòû âû÷èñëåíèé áóäóò ðàçíåñåíû ïî èòåðàöèÿì â "ôèêòèâíîì" ìàññèâå (êîòîðûé íà ñàìîì äåëå íå ÿâëÿåòñÿ ìàññèâîì, ïîñêîëüêó èìååò êîììóòàöèîííûé òèï, à òîëüêî ñâÿçûâàåò îïåðàöèè äðóã ñ äðóãîì). Äàëåå ñëåäóåò ñîáñòâåííî îñíîâíîå ãíåçäî öèêëîâ ÁÏÔ ïî ñòðîêàì:
else if m = 1 then // "ðàáî÷àÿ" èòåðàöèÿ
begin
for i := 0 to 1024 - 1 do
// öèêë ïî ñòðîêàì
begin
for j := 0 to 10 - 1 do
// öèêë ïî èòåðàöèÿì
begin
for k := 0 to 512 - 1 do
// öèêë ïî Áàçîâûì îïåðàöèÿì
begin
But_FFT(ReX_in_com[i,k*2,j], ImX_in_com[i,k*2,j], ReX_in_com[i,k*2+1,j], ImX_in_com[i,k*2+1,j],
// âõîäíûå äàííûå
ReImW[Invert[j,k]], ReImW[Invert[j,k]+1],
// êîýôôèöèåíòû
ReA_com, ImA_com, ReB_com, ImB_com);
// âûõîäíûå äàííûå
ReA_reg := ReA_com;
// ïåðåäà÷à âûõîäíîãî ïîòîêà ÷åðåç ðåãèñòðû äëÿ òîãî ÷òî áû èçáåæàòü "êîëüöà"
ImA_reg := ImA_com;
ReB_reg := ReB_com;
ImB_reg := ImB_com;
for p := 0 to 1 do begin
// öèêë ïåðåäà÷è âûõîäíûõ ïàðàìåòðîâ
if p = 0 then begin
ReX_in_com[i,k,j+1] := ReA_reg;
ImX_in_com[i,k,j+1] := ImA_reg;
end
else if p = 1 then
begin
ReX_in_com[i,k+512,j+1] := ReB_reg;
ImX_in_com[i,k+512,j+1] := ImB_reg;
end;
end;
end;
end;
end;
end
Ðàññìîòðèì îñíîâíîå òåëî ïðîãðàììû. Âèäíî, ÷òî âíóòðåííèé öèêë (ïî k) ðåàëèçóåò âñ¸ íåîáõîäèìîå ìíîæåñòâî áàçîâûõ "áàáî÷åê" íà êàæäîì øàãå ÁÏÔ, âûïîëíÿÿ ïðè ýòîì ïåðåòàñîâêó äàííûõ äëÿ ñëåäóþùåãî øàãà. Ñòðóêòóðà èíäåêñîâ ìàññèâîâ, êàê âèäíî, ëèíåéíà, íî èìååò âêëþ÷¸ííûå êîíñòàíòû, ñîïîñòàâèìûå ñ ïîëîâèíîé ýòîé ðàçìåðíîñòè ìàññèâà. Îõâàòûâàþùèé åãî öèêë ïî j ðåàëèçóåò øàãè ÁÏÔ, à âíåøíèé öèêë ïî i - ïåðåáîð âñåõ ñòðîê.Ñîáñòâåííî, ÁÏÔ ïðàêòè÷åñêè óæå âûïîëíåíî.
else if m = 2 then
// èòåðàöèÿ ïåðåäà÷è äàííûõ â âûõîäíîå ÊÐÏ
begin
for i := 0 to 1024 - 1 do
// öèêë ïî ñòðîêàì
begin
for j := 0 to 1024 - 1 do
// öèêë ïî ñòîëáöàì
begin
ReX_out[i, j] := ReX_in_com[i, j, 10];
ImX_out[i, j] := ImX_in_com[i, j, 10];
end;
end;
end;
end;
ENDCADR;
Ýòîò ìàëåíüêèé çàâåðøàþùèé êóñîê âûïîëíÿåò çàïèñü ðåçóëüòàòîâ â ðåàëüíûå ìàññèâû èç êîììóòàöèîííûõ. Îñòàâøóþñÿ ÷àñòü ïðîãðàììû ìû çäåñü îïóñòèì, ïîñêîëüêó îíà íå èìååò îòíîøåíèÿ ê ñîáñòâåííî ÁÏÔ, à óæå èñïîëüçóåò å¸ ðåçóëüòàòû.
End_Program
Âñ¸, êàê âèäèì, ïðîãðàììà íå î÷åíü ñëîæíà. Îòìåòèì åù¸ ðàç âàæíóþ âåùü: íåñìîòðÿ íà íàëè÷èå â áèáëèîòåêå MyLibNewElement òðèãîíîìåòðè÷åñêèõ ôóíêöèé, âñå ìàññèâû êîýôôèöèåíòîâ äëÿ ýòîé ïðîãðàììû äîëæíû áûòü ïðåäâû÷èñëåíû çàðàíåå. Ñâÿçàíî ýòî ñ äâóìÿ ôàêòîðàìè. Âî-ïåðâûõ, ðàçìåð ìàññèâà èçîáðàæåíèÿ ôèêñèðîâàí è ïîâòîðÿòü îäíó è òóæå ðàáîòó íåò íóæäû, â òî âðåìÿ êàê ïîòîê èçîáðàæåíèé, îáðàáàòûâàåìûõ íà ÏËÈÑàõ, ìîæåò èäòè äîâîëüíî áîëüøèì ïîòîêîì. Âî-âòîðûõ, èñïîëüçîâàíèå òðèãîíîìåòðè÷åñêèõ ôóíêöèé äàæå â ñëó÷àå îäèíî÷íûõ âû÷èñëåíèé íàðóøèëî áû ðàâíîìåðíîñòü çàãðóçêè ýëåìåíòîâ ÏËÈÑ è, êàê ñëåäñòâèå, ïðèâåëî áû ê ïðîñòîþ çíà÷èòåëüíîé ÷àñòè ÏËÈÑ. Êðîìå òîãî, îòìåòèì, ÷òî èñïîëüçîâàíèå â âû÷èñëåíèÿõ ìàññèâà, êàçàëîñü áû, äåñÿòèêðàòíî áîëåå îáú¸ìíîãî, ÷åì èñõîäíûé, âîâñå íå óâåëè÷èâàåò ïàìÿòü, èñïîëüçóåìóþ â ÏËÈÑ-ìîäóëÿõ, ïîñêîëüêó êîììóòàöèîííûé òèï ìàññèâà èñêëþ÷àåò åãî õðàíåíèå òàì, ãäå îíî íå íåîáõîäèìî.
Îïèñàííûå âûøå ñõåìû è ïðîãðàììà ÁÏÔ äëÿ ïðîèçâîëüíîé ñòåïåíè äâîéêè ÿâëÿþòñÿ òîé ðåàëèçàöèåé ìåòîäà Êóëè-Òüþêè, êîòîðûé íàèáîëåå ðàñïðîñòðàí¸í ñðåäè ðåàëèçàöèé ÁÏÔ. Îäíàêî ýòîò àëãîðèòì, íåñìîòðÿ íà åãî ïðåèìóùåñòâà (íàïðèìåð, îäíîòèïíîñòü îñíîâíûõ îïåðàöèé íà êàæäîì øàãå), íå ÿâëÿåòñÿ ñàìûì áûñòðûì èç ðåàëèçàöèé ÁÏÔ íà ñòåïåíÿõ äâîéêè.  ñëó÷àå, åñëè k (ïîêàçàòåëü ñòåïåíè äâîéêè) ÷¸òíî, òî îêàçûâàåòñÿ, ÷òî ÁÏÔ ìåòîäîì Êóëè-Òüþêè äëÿ N = 2k ìîæåò áûòü ðåàëèçîâàíî äàæå çà 3N log2 N / 8 îïåðàöèé êîìïëåêñíîãî óìíîæåíèÿ è N log2 N îïåðàöèé êîìïëåêñíîãî ñëîæåíèÿ. Çà ñ÷¸ò ÷åãî æå ÷¸òíàÿ ñòåïåíü äà¸ò íàì äîïîëíèòåëüíûé âûèãðûø?
Ðàññìîòðèì ïðåîáðàçîâàíèå Ôóðüå ïîðÿäêà 4. Ïðèìåíèì ê íåìó ðàçëîæåíèå íà 2 ÁÏÔ ïîðÿäêà 2 è óâèäèì, ÷òî âñå ïîâîðà÷èâàþùèå ìíîæèòåëè ðàâíû ±1 ëèáî ±i, ÷òî äà¸ò íàì âîçìîæíîñòü íå óìíîæàòü ñîîòâåòñòâóþùèå ýëåìåíòû òàáëèöû, à ïðîñòî áðàòü èõ ñ ðàçíûìè çíàêàìè è êîìáèíèðîâàòü èõ äåéñòâèòåëüíûå è ìíèìûå ÷àñòè. Ïîäïðîãðàììó ïðÿìîãî ÁÏÔ ïîðÿäêà 4 íàáîðà 4 êîìïëåêñíûõ ÷èñåë ìîæíî íà Ôîðòðàíå çàïèñàòü, íàïðèìåð, òàê:
subroutine FT4D(A1,A2,A3,A4)
real
A1(2),A2(2),A3(2),A4(2),C1(2),C2(2),C3(2),C4(2)
C1(1) = A1(1)+A3(1)
C1(2) = A1(2)+A3(2)
C2(1) = A2(1)+A4(1)
C2(2) = A2(2)+A4(2)
C3(1) = A1(1)-A3(1)
C3(2) = A1(2)-A3(2)
C4(1) = A2(1)-A4(1)
C4(2) = A2(2)-A4(2)
A1(1) = C1(1)+C2(1)
A1(2) = C1(2)+C2(2)
A3(1) = C1(1)-C2(1)
A3(2) = C1(2)-C2(2)
A2(1) = C3(1)-C4(2)
A2(2) = C3(2)+C4(1)
A4(1) = C3(1)+C4(2)
A4(2) = C3(2)-C4(1)
return
end
À â îáðàòíîì ÁÏÔ ïîðÿäêà 4 áóäóò íåñêîëüêî ïåðåñòàâëåíû çíàêè è èíäåêñû:
subroutine FT4R(A1,A2,A3,A4)
real
A1(2),A2(2),A3(2),A4(2),C1(2),C2(2),C3(2),C4(2)
C1(1) = A1(1)+A3(1)
C1(2) = A1(2)+A3(2)
C2(1) = A2(1)+A4(1)
C2(2) = A2(2)+A4(2)
C3(1) = A1(1)-A3(1)
C3(2) = A1(2)-A3(2)
C4(1) = A2(1)-A4(1)
C4(2) = A2(2)-A4(2)
A1(1) = C1(1)+C2(1)
A1(2) = C1(2)+C2(2)
A3(1) = C1(1)-C2(1)
A3(2) = C1(2)-C2(2)
A4(1) = C3(1)-C4(2)
A4(2) = C3(2)+C4(1)
A2(1) = C3(1)+C4(2)
A2(2) = C3(2)-C4(1)
return
end
Íî åãî ñòðóêòóðà â ïðèíöèïå - òà æå. Íà ðèñóíêå
ïîêàçàíà ñòðóêòóðà ïðÿìîãî ïðåîáðàçîâàíèÿ Ôóðüå ðàçìåðíîñòè 4,
ò.å. îäíî èç ýëåìåíòàðíûõ ïðåîáðàçîâàíèé ÁÏÔ ïîðÿäêà ÷¸òíîé ñòåïåíè
äâîéêè. Êðàñíûìè ëèíèÿìè îáîçíà÷åíà ïåðåäà÷à íà÷àëüíûõ äàííûõ (ìàññèâà
èç 4 ïàð äåéñòâèòåëüíûõ ÷èñåë, êàæäàÿ ïàðà - äåéñòâèòåëüíàÿ è ìíèìàÿ
÷àñòü ñîîòâåòñòâóþùèõ êîìïëåêñíûõ ÷èñåë). Äàëåå ìû ââåðõó âèäèì
ñòðóêòóðó, ïîõîæóþ íà øàã ÁÏÔ ëþáîé ñòåïåíè äâîéêè, à âíèçó -
"çàïóòàííóþ" ñòðóêòóðó ïîõîæåãî âèäà. Çàïóòàííîñòü âûçâàíà òåì, ÷òî
óìíîæåíèå íà ïîâîðà÷èâàþùèå ìíîæèòåëè áûëî çàìåíåíî ðàññòàíîâêîé çíàêîâ
ñ âçàèìíûìè çàìåíàìè äåéñòâèòåëüíûõ è ìíèìûõ ÷àñòåé. Çåë¸íûìè ñòðåëêàìè
îáîçíà÷åíà çàïèñü äàííûõ â ìàññèâ (è çäåñü ìû âèäèì â ñåðåäèíå
ñòðóêòóðó, çàìåíèâøóþ òðàíñïîíèðîâàíèå ìàòðèöû 2õ2). Êâàäðàòàìè æå
îáîçíà÷åíû ýëåìåíòû ìàññèâà (êðàñíûìè - íà÷àëüíûå äàííûå ÁÏÔ, çåë¸íûìè
- âû÷èñëåííîå ïîäïðîãðàììîé ïðÿìîå ÄÏÔ).
Òåïåðü âñïîìíèì ïðî óìíîæåíèå íà ïîâîðà÷èâàþùèå ìíîæèòåëè, êîòîðîå çàâåðøàåò øàã ÁÏÔ ïîðÿäêà, ðàçëîæåííîãî ïî ÷åòâ¸ðêàì, è óâèäèì, ÷òî èç 4 ïîëó÷åííûõ ïîñëå Ôóðüå ïîðÿäêà 4 êîìïëåêñíûõ ÷èñåë óìíîæåíèþ ïîäâåðãàþòñÿ 3. Òî åñòü èç âñåãî ìàññèâà - 3/4 2, â îòëè÷èå îò ïîëîâèíû 2 â ÁÏÔ, ðàçëîæåííîì ïî äâîéêàì. Îäíàêî çà ñ÷¸ò òîãî, ÷òî ñàìèõ øàãîâ ó íàñ âäâîå ìåíüøå, ìû è ïîëó÷àåì âûèãðûø â ìíîæèòåëå ïðè N log2 N â êîëè÷åñòâå êîìïëåêñíûõ óìíîæåíèé.
Åñëè ìû ïîïûòàåìñÿ ïðèìåíèòü òàêîé æå ïðè¸ì äëÿ óìåíüøåíèÿ äîëè êîìïëåêñíûõ óìíîæåíèé, íàïðèìåð, âçÿâ â êà÷åñòâå áàçîâîãî ÄÏÔ ïîðÿäêà 8 (ñòåïåíü äâîéêè, òàêèì îáðàçîì, äîëæíà äåëèòüñÿ íà 3), òî óâèäèì, ÷òî íà ïîâîðà÷èâàþùèå ìíîæèòåëè óìíîæàþòñÿ 7 ÷èñåë èç 8, ïîëó÷åííûõ ïîñëå ÄÏÔ ïîðÿäêà 8, è çà ñ÷¸ò òîãî, ÷òî ýòàïîâ âòðîå ìåíüøå - è ïîëó÷èì, êàçàëîñü áû, êîýôôèöèåíò 7/24, òî åñòü åù¸ ìåíüøå. Îäíàêî â áàçîâîì ÄÏÔ ïîðÿäêà 8, êàê îêàçûâàåòñÿ, íåëüçÿ óæå ïîëíîñòüþ èçáàâèòüñÿ îò êîìïëåêñíûõ óìíîæåíèé, è ïðè èõ ó÷¸òå ìû ñíîâà ïîëó÷àåì òå æå, ÷òî äëÿ ÷¸òíûõ ñòåïåíåé, 3/8 â êîýôôèöèåíòå ïðè N log2 N. Ïðàâäà, ïðè áëèæàéøåì ðàññìîòðåíèè îêàçûâàåòñÿ, ÷òî ÷àñòü èç óìíîæåíèé ÿâëÿåòñÿ óìíîæåíèåì íà ÷èñëà ñïåöèàëüíîãî âèäà è ìîæåò áûòü âûïîëíåíà áûñòðåå, íî ýòî óñëîæíÿåò îáùóþ ñõåìó. Îäíàêî, åñëè óñëîæíåíèå íå ïóãàåò, òî ìîæíî äîâåñòè îïòèìèçàöèþ äî ðàçìåðíîñòè 16.
Îáùàÿ ñõåìà ÁÏÔ ÷¸òíîé ñòåïåíè äâîéêè, ðàñïèñàííàÿ ÷åðåç ìàêðîîïåðàöèè, âûãëÿäèò åù¸ ñëîæíåå, ÷åì áåç ó÷¸òà ÷¸òíîñòè. Ïîýòîìó çäåñü îíà íå ïðèâîäèòñÿ.
2Íà
ñàìîì äåëå - íå 3/4 è íå ïîëîâèíà, à ÷óòü ìåíüøå.
Ðåàëüíûå çàäà÷è òàêîâû, ÷òî ðàçìåðíîñòü ÄÏÔ, êîòîðîå ïîäëåæèò
"óáûñòðåíèþ", ìîæåò îêàçàòüñÿ âîâñå íå ñòåïåíüþ äâîéêè. Äëÿ òåõ
ñïåöèàëèñòîâ, êòî íå õî÷åò ëîìàòü ãîëîâó íàä âûáîðîì àëãîðèòìà, â
íàñòîÿùåå âðåìÿ ðàñïðîñòðàí¸í ìåòîä ðåøåíèÿ "îò ñòåïåíè", ïðè êîòîðîì
ðåàëüíóþ çàäà÷ó ïðîñòî "ïîäãîíÿþò" ïîä ñòåïåíü äâîéêè (áûâàåò äàæå, ÷òî
ýòî äåëàþò ñ ðåàëüíûìè ÀÖÏ â óñòðîéñòâàõ). Îäíàêî òàêîé ìåòîä âî ìíîãèõ
çàäà÷àõ íåïðèåìëåì ïî ðàçíûì ïðè÷èíàì. Óâåëè÷åíèå ðàçìåðà äî áëèæàéøåé
ñòåïåíè äâîéêè ìîæåò ñóùåñòâåííî óâåëè÷èòü ðàçìåð çàäà÷è. Êðîìå ýòîãî,
ðÿä çàäà÷ òðàäèöèîííî îðèåíòèðîâàí íà ðàçìåðíîñòè, çàâåäîìî íå
ÿâëÿþùèåñÿ ñòåïåíÿìè äâîéêè (õîòü è ñîäåðæàùèå èõ â êà÷åñòâå
äåëèòåëåé). Íàïðèìåð, â ãåîôèçè÷åñêèõ êëèìàòè÷åñêèõ çàäà÷àõ îäíîé èç
òðàäèöèîííûõ ñåòîê ÿâëÿåòñÿ ãðàäóñíàÿ (èëè êðàòíûå ãðàäóñíîé). Ïðè ýòîì
ïîëó÷àåòñÿ, ÷òî ðàçìåðíîñòü ïî äîëãîòå (ñ ó÷¸òîì ïåðèîäè÷íîñòè) áóäåò
êðàòíà 360, òî åñòü ñîäåðæàòü îäíó ïÿò¸ðêó è äâå òðîéêè. Ïîýòîìó
ñóùåñòâóþò òàêèå àëãîðèòìû ÁÏÔ, êàê
ìåòîäû Ãóäà-Òîìàñà, Âèíîãðàäà
è äð. Íàäî ñêàçàòü, ÷òî îíè, êðîìå ïðî÷åãî, ÿâëÿþòñÿ è áîëåå áûñòðûìè,
÷åì àëãîðèòì Êóëè-Òüþêè äëÿ ïðîèçâîëüíîé ñòåïåíè äâîéêè. Ïîýòîìó âî
âðåìåíà, êîãäà åù¸ íå áûëî ìàññîâîé êîìïüþòåðèçàöèè è çàäà÷àìè ÁÏÔ
çàíèìàëèñü òîëüêî ñïåöèàëèñòû, â ïðîãðàììàõ ÁÏÔ öàðèëî ìíîãîîáðàçèå.
Íûíå æå áîëüøèíñòâî èñïîëüçóåò âîâñå íå ñàìûå áûñòðûå ÁÏÔ, äàæå íå
ïîäîçðåâàÿ î òîì, ÷òî âîáùå ìîæíî ðàáîòàòü íå ñî ñòåïåíÿìè äâîéêè.
Ïðè÷¸ì ýòî ñâÿçàíî íå òîëüêî ñ íèçêèì óðîâíåì çíàíèé î ÁÏÔ.
 ñëó÷àå, êîãäà ÁÏÔ àäàïòèðóåòñÿ äëÿ ðåàëèçàöèè íà ïàðàëëåëüíîé âû÷èñëèòåëüíîé ñèñòåìå (ìû èìååì â âèäó ñëó÷àé, êîãäà íóæíî ðàñïàðàëëåëèâàòü ñàìî ïðåîáðàçîâàíèå Ôóðüå, à íå òå àëãîðèòìû, â êîòîðûõ ïðåîáðàçîâàíèé Ôóðüå ðàçíûõ âåêòîðîâ ìíîãî è îíè ñàìè ìîãóò âûïîëíÿòüñÿ ïàðàëëåëüíî èëè êîíâåéåðíî), ëîãè÷åñêàÿ ñëîæíîñòü àëãîðèòìà, è, îñîáåííî, ñëîæíîñòü äåëåíèÿ äàííûõ ïî ÷àñòÿì àëãîðèòìà, ñòàíîâèòñÿ ñóùåñòâåííûì òîðìîçîì äëÿ ýôôåêòèâíîé ðåàëèçàöèè. Êðîìå òîãî, íå ñåêðåò, ÷òî áîëüøèíñòâî ìíîãîïðîöåññîðíûõ âû÷èñëèòåëüíûõ ñèñòåì ñ ðàçäåëüíîé ïàìÿòüþ (êëàñòåðíàÿ àðõèòåêòóðà) ÷àñòî ïðåäîñòàâëÿåò ìàêñèìàëüíîå ÷èñëî óçëîâ, ÿâëÿþùååñÿ ñòåïåíüþ äâîéêè. Ñèñòåìû, íå èìåþùèå òàêèõ îãðàíè÷åíèé, âðîäå ÏËÈÑîâ, èìåþò äðóãèå îãðàíè÷åíèÿ. Íàïðèìåð, ïðè ïðîãðàììèðîâàíèè íà COLAMO óñëîæíåíèå ëîãè÷åñêîé ñòðóêòóðû ïðè ðàâíîé âû÷èñëèòåëüíîé ìîùíîñòè áóäåò ôàêòîðîì, ñíèæàþùèì ïðîèçâîäèòåëüíîñòü áàçîâûõ ìîäóëåé, ïîñêîëüêó ÷àñòü ïðîöåññîðíûõ ýëåìåíòîâ ïðè ñëîæíîé ëîãèêå ïðîãðàììû áóäåò ëèáî ïðîñòàèâàòü, ëèáî ðàáîòàòü, íî âõîëîñòóþ (áåç èñïîëüçîâàíèÿ ðåçóëüòàòà). Íà êëàñòåðíîé àðõèòåêòóðå òàêæå, â ñëó÷àå ðàçáèåíèÿ ñõåìû ÁÏÔ íà áëîêè ïî ïðîöåññîðàì, âîçíèêíóò ñëîæíîñòè, åñëè ðàçáèâàòü ïðèä¸òñÿ ÷àñòè ñõåìû, ðåàëèçóþùèå ÏÔ ìåíüøåé ðàçìåðíîñòè (ðàçíûõ äåëèòåëåé N). Âñ¸ ýòî òàêæå ïðèâîäèò ê òîìó, ÷òî ðåàëèçàöèè äëÿ ñòåïåíåé äâîéêè âûòåñíÿþò îñòàëüíûå àëãîðèòìû ÁÏÔ.
Ê ñîæàëåíèþ, íåëèíåéíàÿ ñõåìà âûçîâîâ ðàçëè÷íûõ ýëåìåíòîâ ðàáî÷èõ ìàññèâîâ ñêàçûâàåòñÿ íà ðàçëè÷íûõ ðåàëèçàöèÿõ ÁÏÔ ïîðÿäêà ñòåïåíè äâîéêè, êîãäà ðå÷ü çàõîäèò îá àäàïòàöèè ñ ìèíèìèçàöèåé îáìåííûõ îïåðàöèé (êàê íà êëàñòåðàõ), ëèáî ïðè îãðàíè÷åííûõ ðåñóðñàõ, âûäåëåííûõ íà ïàðàëëåëüíóþ âåòâü (êàê íà óñêîðèòåëÿõ). Ïðè ýòîì ðÿä ðàçðàáîò÷èêîâ, ñòàëêèâàÿñü ñ òåì, ÷òî âñå ïîâîðà÷èâàþùèå ìíîæèòåëè, ïðåäâû÷èñëåííûå èì, íå ìîãóò áûòü ëèáî ðàçìåùåíû â èìåþùåéñÿ ïàìÿòè, ëèáî áûñòðî äîñòàâëåíû ê ìåñòó èõ èñïîëüçîâàíèÿ, èäóò íà èõ ïåðåâû÷èñëåíèå íà êàæäîì øàãå. Ýòî ñðàçó ñêàçûâàåòñÿ íà áûñòðîòå èõ ðåàëèçàöèé, ïîñêîëüêó ñóùåñòâåííî óâåëè÷èâàåò êîëè÷åñòâî îïåðàöèé ïî ñðàâíåíèþ ñ ýòàëîííûì ÁÏÔ.
Áîëåå ïðàâèëüíûì øàãîì ïî ïðåîäîëåíèþ îãðàíè÷åííîñòè ðåñóðñîâ ëèáî ìèíèìèçàöèè ïåðåñûëîê, âèäèìî, ÿâëÿåòñÿ èñïîëüçîâàíèå òàêîé ñõåìû, êîòîðàÿ çàëîæåíà ñàìà â ÁÏÔ, ïðè å¸ êîíñòðóèðîâàíèè. Èäåÿ, â îáùåì-òî, íàñòîëüêî î÷åâèäíàÿ, ÷òî, êîãäà ó ïðîãðàììèñòà åñòü ïîëíîå ðàçëîæåíèå N íà ïðîñòûå ìíîæèòåëè N=2k, îíà íå âñåì ïðèõîäèò â ãîëîâó: ýòî èñïîëüçîâàòü íå ïîëíîå ðàçëîæåíèå íà ïðîñòûå ìíîæèòåëè, à ðàçëîæåíèå òèïà N=ML, ãäå M, L - äîâîëüíî áîëüøèå ÷èñëà, òîæå ÿâëÿþùèåñÿ ñòåïåíÿìè äâîéêè. Òîãäà ìû âèäèì, ÷òî âñå ïîâîðà÷èâàþùèå ìíîæèòåëè ÁÏÔ ïîðÿäêà N áóäóò èñïîëüçîâàíû òîëüêî îäíàæäû - ìåæäó ÁÏÔ ïîðÿäêà M è ÁÏÔ ïîðÿäêà L. Ñàìè æå ýòè ÁÏÔ ïîðÿäêîâ M, L ìîæíî, â çàâèñèìîñòè îò ðåñóðñîâ, ðåàëèçîâàòü êàê ÁÏÔ ñòåïåíè äâîéêè, ëèáî òîæå ðàçëîæèòü íà ìåíüøèå ìíîæèòåëè, è òàê - äî òîé ñòåïåíè, ïîêà ðåñóðñîâ õâàòèò, ëèáî ïåðåñûëîê ìåæäó êîìïîíåíòàìè ÌÂÑ ñòàíåò äîñòàòî÷íî ìàëî.
Êàê íåòðóäíî âèäåòü ïî ôîðìóëàì, ïðè âûïîëíåíèè ïðåîáðàçîâàíèé Ôóðüå áîëüøîé ðàçìåðíîñòè âåðîÿòíî âû÷èñëåíèå òðèãîíîìåòðè÷åñêèõ ôóíêöèé îò áîëüøèõ àðãóìåíòîâ. Ê ñîæàëåíèþ, ñðåäè ïðîãðàìì-ðåàëèçàöèé ïðåîáðàçîâàíèÿ Ôóðüå àâòîðîì áûëî îáíàðóæåíî ñðàâíèòåëüíî ìàëî ðåàëèçàöèé, âûïîëíÿþùèõ ïðåäâàðèòåëüíîå ïðèâåäåíèå àðãóìåíòà ñ èñïîëüçîâàíèåì öåëî÷èñëåííîé àðèôìåòèêè, à äåéñòâèòåëüíîå ïðèâåäåíèå (èñïîëüçóåìîå ñòàíäàðòíûìè òðèãîíîìåòðè÷åñêèìè ôóíêöèÿìè) äà¸ò áîëüøóþ îòíîñèòåëüíóþ îøèáêó.  ñàìîì äåëå, åñëè ïîðÿäîê N è (ñëåäîâàòåëüíî) àðãóìåíòà - 107, òî åãî ïðèâåäåíèå ê äèàïàçîíó ïåðâîãî ïåðèîäà òðèãîíîìåòðè÷åñêèõ ôóíêöèé äàñò îøèáêó, íà 32-ðàçðÿäîé àðèôìåòèêå (îòíîñèòåëüíàÿ òî÷íîñòü êîòîðîé 10-7) óæå ñðàâíèìóþ ñ åäèíèöåé, ÷òî äåëàåò ïðåîáðàçîâàíèå íåòî÷íûì, à ïðîãðàììó - îãðàíè÷åííî ãîäíîé äëÿ íåáîëüøèõ N.
 ýòîì ïëàíå ÁÏÔ ëó÷øå òðàäèöèîííîãî ïðåîáðàçîâàíèÿ Ôóðüå (ïî òîé ïðîñòîé ïðè÷èíå, ÷òî àðãóìåíòû ó ôóíêöèé ñóùåñòâåííî ìåíüøå, è ïîýòîìó ïðîãðàììèñòñêèå ïðîñ÷¸òû ñêàçûâàþòñÿ ìåíüøå), íî è çäåñü ðåçåðâû áîëåå òî÷íûõ âû÷èñëåíèé èñïîëüçóþòñÿ ðåäêî.  ëó÷øåì ñëó÷àå ýòè ðåçåðâû èñïîëüçóþòñÿ äëÿ ïðåäâû÷èñëåíèé ïîâîðà÷èâàþùèõ ìíîæèòåëåé äðóã ÷åðåç äðóãà. Îäíàêî â ñëó÷àå ðàçìåðíîñòè, ðàâíîé öåëîé ñòåïåíè äâîéêè, îêàçûâàåòñÿ, ÷òî è ïîñëåäíåå óõèùðåíèå (ïðåäâû÷èñëåíèå ìíîæèòåëåé) äàñò òîëüêî äîïîëíèòåëüíûå îøèáêè, â òî âðåìÿ êàê ïðèìåíåíèåì ïðîñòîé ñîðòèðîâêè ñ öåëî÷èñëåííûì ïðèâåäåíèåì îíî äåëàåòñÿ íåíóæíûì.
ÁÏÔ òðàäèöèîííî îòíîñÿò ê ãðóïïå áûñòðûõ àëãîðèòìîâ. Ñëåäóåò, îäíàêî, îòìåòèòü, ÷òî ìíîãèå áûñòðûå àëãîðèòìû, èñïîëüçóþùèå àññîöèàòèâíîñòü è äèñòðèáóòèâíîñòü óìíîæåíèé è ñëîæåíèé, ÿâëÿþòñÿ íåóñòîé÷èâûìè. Íà ÁÏÔ ýòî íå ðàñïðîñòðàíÿåòñÿ - êàê ìû âèäèì, äàæå ïðè èñïîëüçîâàíèè òóïîãî ïðîãðàììèðîâàíèÿ áåç ó÷¸òà îñîáåííîñòåé òðèãîíîìåòðè÷åñêèõ ôóíêöèé âëèÿíèå îøèáîê îêðóãëåíèÿ íà ÁÏÔ ìåíüøå, ÷åì íà èñõîäíîå ïðåîáðàçîâàíèå Ôóðüå.
Ê ñîæàëåíèþ, íåóìåëîå ïðîãðàììèðîâàíèå, âñòðå÷àþùååñÿ äàæå â êîäàõ ôèðìåííîé ïîääåðæêè ÁÏÔ íà ðàçëè÷íûõ óñêîðèòåëÿõ, ïðèâîäèò ê òîìó, ÷òî ïðåèìóùåñòâà ÁÏÔ ñ ïîðÿäêîì âåêòîðà, ðàâíûì ñòåïåíè äâîéêè, â èçâåñòíîé ñòåïåíè ñíèæàþòñÿ èç-çà òîãî, ÷òî òðèãîíîìåòðè÷åñêèå ôóíêöèè âû÷èñëÿþòñÿ íà êàæäîì øàãå è ïîòîìó íåèçáåæíî óâåëè÷èâàþò êîýôôèöèåíòû êîëè÷åñòâà îïåðàöèé ïðè ãëàâíîì ÷ëåíå (N log2 N). Ìåæäó òåì, ïðåäâàðèòåëüíîå ïðåäâû÷èñëåíèå âñåé íóæíîé äëÿ ÄÏÔ òðèãîíîìåòðèè äà¸ò âîçìîæíîñòü âûïîëíèòü òðèãîíîìåòðèþ çà O(N) îïåðàöèé, ïðè÷¸ì äàæå ýòî ïðåäâû÷èñëåíèå ìîæåò áûòü â îñíîâíîì çàíÿòî íå âûçîâàìè òðèãîíîìåòðè÷åñêèõ ôóíêöèé, à êîìïëåêñíûìè óìíîæåíèÿìè, êàê õîòÿ áû â ïðèìåðå ïðîãðàììû, èñïîëüçóþùåé ôîðìóëû ïðèâåäåíèÿ äëÿ ðàçáèâàíèÿ âñåãî äèàïàçîíà íà 16 ÷àñòåé.
Òàêæå âûçûâàåò ñîæàëåíèå äðóãîå - ðåäêîå 3 èñïîëüçîâàíèå ðàçðàáîò÷èêàìè äëÿ ñîâðåìåííûõ ïàðàëëåëüíûõ âû÷èñëèòåëüíûõ ñèñòåì ïðåèìóùåñòâ ÷¸òíîé (à òàêæå êðàòíîé òðîéêå è ÷åòâ¸ðêå) ñòåïåíè äâîéêè. Ñõåìû ïðè ýòîì ïîëó÷àþòñÿ ñëîæíåå, íî îíè íå äàþò íàì "õîëîñòûõ" âåòâåé è ðàçáèåíèé ðàçíîé ðàçìåðíîñòè. Ïîýòîìó ðàçðàáîò÷èêàì, æåëàþùèì îïòèìèçèðîâàòü ÁÏÔ äëÿ ñòåïåíåé äâîéêè, ñîâåòóåì îáðàùàòü âíèìàíèå íà ýòó âîçìîæíîñòü.
3 Ðåäêîå - íå òî ñëîâî. Íàì òàêèå ðåàëèçàöèè ïðîñòî íå âñòðå÷àëèñü.
¿ Ëàáîðàòîðèÿ
Ïàðàëëåëüíûõ èíôîðìàöèîííûõ òåõíîëîãèé ÍÈÂÖ ÌÃÓ