Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ îðèãèíàëüíîãî äîêóìåíòà : 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 ýëåìåíòàìè

Fqj = exp(-2πiqj/N)   1

äëÿ ïîëó÷åíèÿ âåêòîðà a= (a0, ..., aN-1)T ïî ôîðìóëå a = Ff. Òîãäà äëÿ ýëåìåíòà èñêîìîãî âåêòîðà óìíîæåíèå äàñò ôîðìóëó:

aq=(Σfj exp(-2πi q j / N))                   (ñóììà ïî j = 0, ..., N-1)

Êàê èçâåñòíî, â îáùåì ñëó÷àå óìíîæåíèå ìàòðèöû íàì âåêòîð òðåáóåò 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

Ðàññìîòðèì ñëó÷àé N = p1 p2, ïðè÷¸ì ñîìíîæèòåëè íå ðàâíû 1. Òîãäà, ïðåäñòàâèì èíäåêñû ýëåìåíòîâ âåêòîðîâ è ìàòðèöû q, j â âèäå

q = q1 + p1 q2,                    j = j2 + p2j1
(0 ˜ j1, q1 < p1,                     0 ˜ j2, q2 < p2)

è ïîäñòàâèì èõ â èñõîäíóþ ôîðìóëó äëÿ ýëåìåíòà èñêîìîãî âåêòîðà. Òîãäà ïîñëå íåñëîæíûõ àðèôìåòè÷åñêèõ ïðåîáðàçîâàíèé, ó÷èòûâàÿ òî, ÷òî

(q1 + p1 q2) (j2 + p2j1) / p1p2 = q2 j1 + j1q1 / p1 + q j2 / N

è òî, ÷òî ìíèìàÿ ýêñïîíåíòà ïåðèîäè÷íà ñ ïåðèîäîì 2π, ïîëó÷èì, ÷òî

aq= a (q1, q2) = (Σ b (q1, j2) exp(-2πi q j2/ N))           (ñóììà ïî j2 = 0, ..., p2-1)

ãäå

b(q1, j2) = (Σfj2 + p2j1 exp(-2πi q1 j1 / p1))                   (ñóììà ïî j1 = 0, ..., p1-1)

Ïðè âû÷èñëåíèè ïî ïðåäñòàâëåííîìó àëãîðèòìó òðåáóåòñÿ âñåãî

O (p12 p2) + O (p22 p1)

àðèôìåòè÷åñêèõ îïåðàöèé.  ñëó÷àå, êîãäà ñîìíîæèòåëè ðàâíû äðóã äðóãó, îáùåå êîëè÷åñòâî îïåðàöèé ñîñòàâèò

O(N3/2).

Îïèñàííûé àëãîðèòì è íîñèò íàçâàíèå "Áûñòðîå ïðåîáðàçîâàíèå Ôóðüå".

Ñâåäåíèå ïðåîáðàçîâàíèÿ Ôóðüå ê ïîñëåäîâàòåëüíîñòè ïðåîáðàçîâàíèé ìåíüøåé ðàçìåðíîñòè

Ïðèâåä¸ííûå âûøå ôîðìóëû ïîêàçûâàþò èíòåðåñíóþ âåùü. Îêàçûâàåòñÿ, åñëè çàïèñàòü èñõîäíûé âåêòîð f ïî ñòîëáöàì ïðÿìîóãîëüíîé òàáëèöû ðàçìåðà p2 íà p1, òî åãî ïðåîáðàçîâàíèå Ôóðüå â âåêòîð a ìîæåò áûòü âûïîëíåíî â ñëåäóþùèå òðè äåéñòâèÿ (íà ðèñóíêàõ-ïðèìåðàõ ìû áóäåì ñ÷èòàòü, ÷òî èñõîäíàÿ ðàçìåðíîñòü ðàâíà 15):

  1. Âû÷èñëåíèå ïðåîáðàçîâàíèé Ôóðüå ïîðÿäêà p1âñåõ ñòðîê òàáëèöû (êðàñíûì íà ðèñóíêå ïîêàçàíû ãðóïïû ýëåìåíòîâ ìàññèâà, íàä êîòîðûìè âûïîëíÿþòñÿ ÄÏÔ ðàçìåðíîñòè p1=3).

  2. Óìíîæåíèå ýëåìåíòîâ ïîëó÷åííîé òàáëèöû íà ò.í. ïîâîðà÷èâàþùèå ìíîæèòåëè (ñåðûì íà ðèñóíêå ïîêàçàíû ýëåìåíòû ìàññèâà, êîòîðûå íå íóæíî óìíîæàòü, ðàçíûìè öâåòàìè - óìíîæàåìûå íà ðàçíûå ïîâîðîòíûå ìíîæèòåëè; êàê ìû âèäèì, ÷àñòü ïîâîðà÷èâàþùèõ ìíîæèòåëåé ïîâòîðÿåòñÿ).

  3. Âû÷èñëåíèå ïðåîáðàçîâàíèé Ôóðüå ïîðÿäêà p2 âñåõ ñòîëáöîâ òàáëèöû (êðàñíûì íà ðèñóíêå ïîêàçàíû ãðóïïû ýëåìåíòîâ ìàññèâà, íàä êîòîðûìè âûïîëíÿþòñÿ ÄÏÔ ðàçìåðíîñòè p2=5).

Èñêîìûé âåêòîð 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 Ðåäêîå - íå òî ñëîâî. Íàì òàêèå ðåàëèçàöèè ïðîñòî íå âñòðå÷àëèñü.


¿ Ëàáîðàòîðèÿ Ïàðàëëåëüíûõ èíôîðìàöèîííûõ òåõíîëîãèé ÍÈÂÖ ÌÃÓ
Rambler's Top100