Blok Krylov Metotlarive B{IM++ (Blok {Iteratif Metotlar) Paketi

advertisement
Blok Krylov Metotlar¬ve BI·M++ (Blok
I·teratif Metotlar) Paketi
Ali Dinler
Onur Dinçer
Ali Demirci
Şubat 2008
Içindekiler
1 Giriş
3
2 Krylov Metotlar¬
2.1 Blok GMRES Metodu . . . . . . . . . . . . . . . . . . . . . .
3
6
3 BI·M++
3.1 BI·M++::Giriş . . . . . . .
3.2 BI·M++::Dizayn . . . . . .
3.3 BI·M++::C++ . . . . . . .
3.4 BI·M++::Geliştirme . . . .
3.5 BI·M++::Kurulum . . . .
3.5.1 Windows . . . . . .
3.5.2 Linux ve Mac OSX
3.6 BI·M++::Kullan¬m . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
9
10
10
12
12
14
15
4 Gelecek...
17
5 EK
19
1
•
Ozet
Krylov metotlar¬, en genel anlamda, matris-vektör çarp¬mlar¬ile Ax = b
lineer sistemini çözen metotlard¬r. Burada, A tekil olmayan katsay¬ matrisi, x bilinmeyenler vektörü, b de sa¼
g taraf vektörüdür. Katsay¬ matrisi
çok büyük oldu¼
gunda, Gauss yoketme gibi direk lineer sistem çözücü yöntemler yerine iteratif bir yöntem kullan¬lmas¬mecburidir. Dahas¬, baz¬problemlerde katsay¬ matrisi A de¼
gişmedi¼
gi halde, farkl¬ sa¼
g tara‡ar ile Ax =
bi ; i = 1; ::m, lineer sisteminin m defa çözülmesi gerekir. Bunun yerine
AX = B, B = [b1 ; b2 ; ::; bm ] blok sistemi oluşturulabilir ve çok daha verimli ve h¬zl¬bir şekilde Blok Krylov metotlar¬ile bir defada çözülebilir. Bu
dokümantasyonda, LAPACK kütüphanesi üzerine C++ programlama diliyle
geliştirmekte oldu¼
gumuz BI·M++ paketi anlat¬lacakt¬r.
2
1
Giriş
Blok iteratif metotlar paketi, BI·M++, simetrik ve simetrik olmayan blok
lineer sistemleri çözen iteratif metotlar¬n bir uygulamas¬d¬r. Blok Krylov
metotlar¬son y¬llarda mühendislik problemlerinin çözümünde çok önem kazanm¬şt¬r, [Din07]. Bu paketin amac¬, LAPACK [Bai95] için yaz¬lm¬ş CPPLapack arayüzünü [Oni05] geliştirerek
1. Blok Krylov metotlar¬için yüksek başar¬ml¬ve kolay kullan¬labilir bir
paket oluşturmak
2. C++’¬n sahip oldu¼
gu teknolojilerden en kolay şekilde faydalanmay¬
sa¼
glamak
3. I·leri say¬sal lineer cebir algoritmalar¬n¬n daha k¬sa ve daha anlaş¬l¬r
şekilde programlanmas¬n¬sa¼
glamak
4. Kullanmak için olabildi¼
gince az programlama bilgisi gerektiren bir paket
oluşturmak
5. Tekrar kullan¬labilir, taş¬nabilir ve kolayca geliştirilebilir bir paket oluşturmak
6. Windows ortam¬nda çal¬şabilir bir paket yazmakt¬r.
2
Krylov Metotlar¬
Krylov metotlar¬ en genel anlamda matris vektör çarp¬mlar¬ ile Ax = b
lineer sistemini çözen metotlard¬r. Matris vektör çarp¬mlar¬na ek olarak
A matrisinin transpozu ya da hermityan¬ (eşlenik transpozu) da gerekebilir. Krylov metotlar¬na örnek olarak GMRES (Generalized Minimal Residual), CG (Conjugate Gradient), CGS (Conjugate Gradient Squared), QMR
(Quasi-Minimal Residual), TFQMR (Transpose Free Quasi-Minimal Residual ), Bi-CGSTAB (Bi-Conjugate Gradient Stabilized) verilebilir [Gre97].
Krylov metotlar¬ndan olan GMRES algoritmas¬simetrik olmayan büyük
lineer sistem çözümünde en önemli iteratif yöntemlerden biridir [Saa96].
GMRES algoritmas¬1986 da Yousef Saad ve Martin H. Schultz taraf¬ndan
SIAM Journal on Scienti…c and Statistical Computing dergisinde yay¬nlanan
makale ile ortaya ç¬km¬şt¬r.
3
Krylov metotlar¬n¬n arkas¬nda yatan …kir tekil olmayan nxn’lik Ax = b
sisteminin çözümünün n boyutlu Krylov alt uzay¬nda aranmas¬d¬r.
x0 seçilen bir başlang¬ç vektörü olsun. r0 = b Ax0 da başlang¬ç kaland¬r
(residual). Bu durumda Krylov altuzay¬
Km (A; r0 ) = span r0 ; Ar0 ; A2 r0 ; :::; Am 1 r0
şeklinde tan¬mlan¬r. Krylov altuzay¬na arama uzay¬ya da muhtemel çözümler
uzay¬da denebilir [Saa96].
Tan¬m: A bir n-kare matris olsun ve J(A) da, f (A) = 0 özelli¼
gindeki tüm
f (t) polinomlar¬n¬n bir koleksiyonunu göstersin. J(A)’n¬n boş olmad¬g¼¬na
dikkat ediniz, çünkü A’n¬n öz polinomuda J(A)’dad¬r. J(A)’da minimum
dereceli monik polinom m(t) olsun. Bu durumda m(t), A’n¬n minimum polinomu olarak adland¬r¬l¬r. Minimum polinom m(t) öz polinomu böler.
Teorem: Tekil olmayan bir A matrisinin minimum polinomunun derecesi
m ise, Ax = b lineer sisteminin çözümü Km (A; r0 ) uzay¬ndad¬r. Di¼
ger bir
deyişle bu durumda Krylov altuzay¬n¬n m boyutlu ortonormal baz¬n¬bulmak
yeterlidir.
Arnoldi Algoritmas¬: Arnoldi algoritmas¬ esasen Gram-Schimdt ortogonalleştirme metodunun Krylov alt uzay¬na uygulanmas¬d¬r. Modi…ye
edilmiş Arnoldi algoritmas¬şöyledir [Kel95]:
1. Başlang¬ç bir v1 vektörü seçilir.
2. For j = 1; :::; m Do:
3. wj = Avj
4. For i = 1; :::; j Do:
5. hi;j = (wj ; vi )
6. wj := wj
hi;j vi
7. End Do
8. hj+1;j =k wj k2 : If hj+1;j = 0 Stop
9. vj+1 = wj =hj+1;j
10. End Do
4
Burada (; ) iç çarp¬m¬, k : k2 öklid normunu göstermektedir. Yukar¬da
görülen Arnoldi metodunun karmaş¬kl¬g¼¬nxn’lik sistem için
F lops Bellek
2m2 n (m + 1)n
dir [Saa96].
GMRES algoritmas¬kalan normu x0 + Km uzay¬nda minimum yapmaya
çal¬ş¬r.
GMRES Algoritmas¬:
1. Başlang¬ç bir x0 vektörü seçilir.
2. r0 = b
Ax0 ;
:=k r0 k2 ve v1 = r0 =
3. Hm (m + 1)xm’lik matris ve hi;j ’ler bu matrisin elemanlar¬. Hm = 0:
4. For j = 1; :::; m Do:
5. wj = Avj
6. For i = 1; :::; j Do:
7. hi;j = (wj ; vi )
8. wj := wj
hi;j vi
9. End Do
10. hj+1;j =k wj k2 : If hj+1;j = 0 m := j ve go to 13
11. vj+1 = wj =hj+1;j
12. End Do
13. k e1
Hm ym k2 minimum olacak şekilde ym vektörünü bul
14. xm = x0 + Vm ym
15. Yukar¬da e1 nxn’lik bir birim matrisin birinci kolonudur.
5
GMRES algoritmas¬nda en büyük problem ortogonalli¼
gin kaybedilmesidir. Bu durum yuvarlatma hatas¬ndan kaynaklanabilir. A’n¬n kötü-huylu
(ill-conditioned) olma durumunda yuvarlatma hatas¬ortogonalli¼
gi bozabilir
ya da sistemi tekil hale getirebilir [Kel95]. Algoritmay¬iyileştirmek için daha
kuvvetli ortogonalleştirme yöntemi olan Householder yöntemi kullan¬labilir
ya da kontrol alt¬nda baz¬ ad¬mlarda tekrar ortogonalleştirmeye gidilebilir
[Saa96].
GMRES algoritmas¬nda 13. ad¬m ayr¬ bir önem taş¬r. Hm+1,m matrisi
bir üst-Hessenberg1 matristir. Bu Hm+1,m Hessenberg matrisinin sat¬r say¬s¬
sütün say¬s¬ndan bir fazlad¬r yani kare de¼
gildir. Dolay¬s¬yla Hm ym = e1
sistemi sat¬r say¬s¬bilinmeyen say¬s¬ndan fazla olan (overdetermined) bir sistemdir. Bu sistemin çözümü en küçük kareler problemidir. Bu en küçük
kareler problemine en bilindik yaklaş¬m QR ayr¬ş¬m¬d¬r [BuTu92].
Hessenberg matrislere QR ayr¬ş¬m¬uygulamak oldukça verimlidir. Bu en
küçük kareler problemine arka arkaya plane dönüşümleri (Given dönüşümleri
de denir) uygulanarak R matrisi ve yeni gm sa¼
g tarf¬bulunur. R matrisi üst
üçgensel matristir. O halde yeni sistemimiz nxn0 lik
Rym = gm
lineer sistemidir ve kolayca geri eleme yöntemi ile çözülebilir.
Uygulamada, büyük sistemlerle u¼
graş¬l¬rken Krylov altuzay¬n¬n boyutu
da büyük olur. Bu durumda ortonormal baz vektörlerinin elde edilmesi ve
bellekte tutulmas¬ imkans¬z olur [DDSV98]. Bu problem yine iteratif yaklaş¬m ile çözülür. Krylov altuzay¬ için m gibi bir boyut seçilir (m << n)
ve m tane baz vektör hesaplanarak bir çözüme gidilir. Bulunan bu çözüm
yeni başlang¬ç de¼
geri olarak al¬n¬r ve GMRES m boyutta tekrar çözülür.
Bu iteratif yaklaş¬ma tekrar başlayan GMRES (GMRES restarted) denir ve
GMRES(m) ile gösterilir. Bu şekilde bellek problemi olan direk metotlara
göre ciddi üstünlük elde edilir, ancak GMRES(m)’nin yak¬nsakl¬g¼¬GMRES’e
göre daha kötüdür [Bar94].
Bundan sonraki k¬s¬mda Blok GMRES algoritmas¬ndan bahsedece¼
giz.
Di¼
ger blok algoritmalar blok olmayan versiyonlar¬ndan kolayca türetilebilir.
2.1
Blok GMRES Metodu
Blok Krylov metotlar¬birden fazla sa¼
g tara‡¬büyük sistemlerin çözümünde
çok önemlidir. Ayn¬ katsay¬ matrisine ama farkl¬ sa¼
g tarafalara sahip bir
1
Fazladan alt-köşegene sahip üst üçgensel matris
6
sistem blok yöntemler ile bir kerede çözülebilir. Blok metotlar tek bir vektörle
de¼
gil vektör bloklar¬ile iş yaparlar, bu da bellek kullan¬m¬n¬iyileştirir. Bu
yüzden tek sa¼
g tara‡¬sistemler için de blok yaklaş¬m kullan¬labilir ([BDJ03],
[Li97]). Bilimsel hesaplamada bellek yönetimi ve kullan¬m¬n¬n çok önemli
hale gelmesi, blok metotlar¬ön plana getirmişitir [Don03].
Blok Arnoldi Algoritmas¬: nxn’lik ve p blok boyutlu bir blok sistem
için algoritma şöyledir [Saa96];
1. Başlang¬ç bir V1 nxp’lik bir ortogonal matris seçilir.
2. For j = 1; :::; m Do:
3. Wj = AVj
4. For i = 1; :::; j Do:
5. Hi;j = ViT Wj
6. Wj := Wj
Vi Hi;j
7. End Do
8. Wj QR ayr¬ş¬m¬ile Wj = Vj+1 Hj+1;j şeklinde ayr¬l¬r.
9. End Do
Blok olmayan Arnoldi algoritmas¬nda vektör olan ifadeler burada art¬k
matristir. Yine blok olmayan Arnoldi algoritmas¬nda skalar olan hi;j ’ler
art¬k pxp’lik matrislerdir.
Blok GMRES Algoritmas¬(BGMRES): nxn’lik ve p blok genişilikli
sistem için algoritma şöyledir;
n = m:p ve m Blok Krylov altuzay¬n¬n boyutu olmak üzere
1. Başlang¬çta bir nxp’lik bir V1 ortogonal matris seçilir.
2. R0 = B
AX0
3. R0 QR ayr¬ş¬m¬ile R0 = V1 Rr0 şeklinde ayr¬şt¬r¬l¬r.
4. For j = 1; :::; m Do:
5. Wj = AVj
7
6. For i = 1; :::; j Do:
7. Hi;j = ViT Wj
8. Wj := Wj
Vi Hi;j
9. End Do
10. Wj QR ayr¬ş¬m¬ile Wj = Vj+1 Hj+1;j şeklinde ayr¬l¬r.
11. End Do
12. Vm+1 = fV1 ; V2 ; :::; Vm+1 g; nx(m + 1):p’lik matris
13. Vm = fV1 ; V2 ; :::; Vm g; nxn’lik matris
14.
T
B ,B burada bizim sa¼
g taraf matrisimiz
e1 = Vm+1
15. H QR ayr¬ş¬m¬ile H = QH RH şeklinde ayr¬l¬r.
16. gm = QTH : e1
17. RH :ym = gm ; sistemi üst üçgensel nxn’lik bir sistem
18. xm = Vm ym
Blok olmayan GMRES algoritmas¬nda oldu¼
gu gibi BGMRES algoritmas¬n¬n
da tekrar-başlayan çeşiti (BGMRES(m)) yap¬labilir. Ayr¬ca Blok Arnoldi
k¬sm¬ndan sonra sadece tek sa¼
g taraf kullan¬larak ve tek sa¼
g tara‡¬ sistem
çözülebilir [BDJ03].
3
3.1
BI·M++
BI·M++::Giriş
Blok iteratif metotlar paketi, BI·M++, simetrik ve simetrik olmayan blok
lineer sistemleri çözen metotlar¬n bir uygulamas¬d¬r. BI·M++, LAPACK
kütüphanesinin üzerine nesneye dayal¬ olarak yaz¬lm¬ş CPPLapack [Oni05]
arayüzü geliştirilerek yaz¬lm¬şt¬r. LAPACK kütüphanesi, say¬sal lineer cebir problemleri -özellikle lineer sistem çözümü, lineer en küçük kareler ve
özde¼
ger-özvektör problemleri için FORTRAN dilinde yaz¬lm¬ş yüksek başar¬ml¬
8
bir kütüphanedir. Halihaz¬rda LAPACK 1000’den fazla fonksiyon ve 660.000’den
fazla sat¬r FORTRAN 77 kodu içerir.
LAPACK kütüphanesi, kullanmas¬ dikkat isteyen ve kolayca kar¬şt¬r¬labilir çok parametreli fonksiyonlardan oluşur. Bu yüksek başar¬ml¬kütüphane
için C++ teknolojisi ile kullanmay¬kolaylaşt¬racak arayüzler ve kütüphaneler
yaz¬lm¬şt¬r. Bunlardan baz¬lar¬LAPACK++, CvmLib, FLENS, CPPLapack,
SparseLib++, MV++ ve IML++’d¬r. Bunlar¬n baz¬s¬n¬n hala kullan¬m¬kolay de¼
gildir, baz¬s¬n¬n kurulumu özel derleyici ve/veya derleyici seçenekleri
gerektirir, baz¬s¬n¬n dokümantasyonu iyi de¼
gildir, baz¬s¬ise yeterince geliştirilmemiş ya da geliştirilmesi b¬rak¬lm¬şt¬r.
Blok GMRES gibi yeni say¬sal lineer cebir algoritmalar¬ için kolay kullan¬labilir bir ortam oluşturmak için bir arayüze ihtiyac¬m¬z vard¬. LAPACK
kullan¬larak oluşturulacak yüksek başar¬ml¬ bir paketin daha kullan¬labilir
olmas¬ için CPPLapack arayüzünü seçtik. Bu arayüzün seçilmesindeki en
önemli sebepler kurulum gerektirmeyen başl¬k (header) dosyalar¬ndan oluşmas¬ ve CPPScaLapack [Oni05] gibi ScaLAPACK2 için kardeş arayüzünün
olmas¬d¬r. Ayr¬ca Windows’da da kolayca kullan¬labilecek olmas¬ idi. Bizi
düşündüren taraf¬ise dokümantasyonunun çok zay¬f olmas¬oldu.
3.2
BI·M++::Dizayn
BI·M++, Blok Krylov metotlar¬n¬kolayca kullanabilmek için yaz¬ld¬. BI·M++’¬n
kolayca kullan¬lmas¬için LAPACK’e en kolay ulaşmay¬sa¼
glayan KEYcpplapack başl¬k dosyas¬n¬ oluşturduk. Di¼
ger bir deyişle, LAPACK ve CPPLapack’i sakl¬yoruz ve olabildi¼
gince az programlama bilgisi ile bu paketi kullan¬l¬r hale getiriyoruz.
2
Paralel hesaplama kütüphanesi. LAPACK kütüphanesinin da¼
g¬t¬k paralel sistemler
için geliştirilen versiyonu. http://www.netlib.org/scalapack/scalapack_home.html
9
3.3
BI·M++::C++
C++, her nekadar bilimsel hesaplama için geliştirilmemiş olsada [Str97], karmaş¬k bilimsel algoritmalar için çok önemli olabilecek kal¬t¬m (inheritance),
çok biçimlilik (polymorphism) ve türden ba¼
g¬ms¬z programlama (generic programming) gibi yeni teknolojilere sahiptir. Ne yaz¬k ki bu teknolojiler yüksek
başar¬ml¬hesaplamada ekstra yük getirdi¼
ginden, son zamanlara kadar bilimsel hesaplama için tercih edilmemiştir.
Üçüncü versiyon ANSI C++ ile gelen parametrik çok şekillili¼
gi sa¼
glayan
şablonlar (templates) ve şablona yönelik programlama (template metaprogramming) yüksek başar¬ml¬hesaplama için C++’a şans verdi. Baz¬çal¬şmalar C++’¬n FORTRAN’dan h¬zl¬ olabilece¼
gini gösterdi [VeJe97]. Biz de
·
BIM++’da yüksek verimlilik için şablon (template) teknolojisini kulland¬k.
3.4
BI·M++::Geliştirme
En az programlama bilgisi ile hatta hiç C++ bilgisi gerektirmeden kullan¬labilir yüksek başar¬ml¬bir paket oluşturmaya çal¬şt¬k.
Algoritmalar
10
Bcg (A,B,kmax,eps) Blok Conjugate Gradient Metot.
iterarif şablon (template) fonksiyon Bcg.
hermityan pozitif tan¬ml¬blok lineer sistemi çözer
conjugate gradient yönteminin blok versiyonudur [Bar94].
input:
A katsay¬matrisi
B sa¼
g taraf matrisi
kmax maximum iterasyon say¬s¬
eps tolerans
output:
B çözüm
Dikkat:B matrisini üzerine yaz¬l¬yor
Bbcg(A,B,kmax,eps) Blok Bi-Conjugate Gradient Metot.
iterarif şablon (template) fonksiyon Bbcg.
Bbcg, blok lineer sistem AX=B ’yi çözer
bi-conjugate gradient yönteminin blok versiyonudur.
input:
A katsay¬matrisi
B sa¼
g taraf matrisi
kmax maximum iterasyon say¬s¬
eps tolerans
output:
B çözüm
Dikkat:B matrisini üzerine yaz¬l¬yor
Bbicgstab
Bgmres
Bgmres(m)
Blok Bi-Conjugate Gradient Stabilized Metot
Blok Generalized Minimal Residual
Blok Generalized Minimal Residual restarted
LAPACK çok büyük bir kütüphane ve CPPLapack bir çok LAPACK
fonksiyonunu içermiyor. Biz bu arayüze BI·M++ için gerekli olan
Metot
tr()
qqr()
rqr()
qr()
Aç¬klama
Matrisin izini bulur.
QR ayr¬ş¬m¬yapar ve Q matrisini verir.
QR ayr¬ş¬m¬yapar ve R matrisini verir.
QR ayr¬ş¬m¬yapar ve Q ve R matrisini verir
LAPACK fonksiyonlar¬n¬ekledik. Bundan sonra da ihtiyaç oldukça bu arayüze
eklemeler yapaca¼
g¬z.
·
BIM++’¬n daha kolay kullan¬lmas¬için tür tan¬mlamalar¬yapt¬k:
11
CoV Sütun Vektör
RoV Sat¬r Vektör
GeM Genel Matris
SyM Simetrik Matris
BaM Bant Matris
SpM Seyrek (Sparse) Matris
CcoV Kompleks Sütun Vektör
CroV Kompleks Sat¬r Vektör
CgeM Kompleks Matris
CheM Hermityan Matris
CbaM Kompleks Bant Matris
CspM Kompleks Seyrek (Sparse) Matris
3.5
BI·M++::Kurulum
BI·M++’¬n Windows’a zahmetsiz kurulan, Windows’ta kolayca ve sorunsuzca
çal¬şan bir paket olmas¬n¬istedik.
BI·M++’¬n kurulumu her sistem için LAPACK kütüphanesini kurmaktan
ibarettir.
3.5.1
Windows
1. http://www.cygwin.com adresinden cygwin setup.exe program¬n¬ inidirin.
2. setup.exe program¬n¬çal¬şt¬r¬n.
3. I·leri ileri diyerek aşa¼
g¬daki pencereye kadar gelin ve Math seçimine
t¬klay¬n
12
4. Aşa¼
g¬daki pencereden lapack için işaretli k¬sm¬"install" olarak üzerine
t¬klayarak seçin (sizde Keep yazmayabilir önemli de¼
gil)
13
5. 3. aşamadaki pencereden bu sefer Devel alt¬nda make ’i seçin.
6. I·leri ileri diyerek cygwin’i kurun.
7. Daha sonra www2.itu.edu.tr/sdinlera/bimpp adresinden BI·M++ paketini indirin ve açarak C:ncygwinnhome dizininin içine kopyalay¬n. Paketin
içinde make…les dizini alt¬nda mak…le_cygwin dosyas¬n¬n ismini Make…le olarak de¼
giştirin ve ornekler dizinine kopyalay¬n, cygwin program¬n¬
çal¬şt¬r¬n
cd /home/BIM++/ornekler
make run
diyerek örnek programlar¬çal¬şt¬rabilirsiniz.
3.5.2
Linux ve Mac OSX
www.netlib.org/lapack adresinden lapack’i indirin. Paket ile gelen kurulum
aşamalar¬n¬ anlatan yard¬m dosyas¬n¬n¬ okuyarak lapack’i derleyin. Daha
sonra www2.itu.edu.tr/sdinlera/bimpp adresinden BI·M++ paketini indirin
ve açarak ev dizininize kopyalay¬n. Paketin içinde make…les dizini alt¬nda
mak…le_cygwin dosyas¬n¬n ismini Make…le olarak de¼
giştirin ve ornekler dizinine kopyalay¬n, cygwin program¬n¬çal¬şt¬r¬n
cd /home/BIM++/ornekler
make run
diyerek örnek programlar¬çal¬şt¬rabilirsiniz.
14
3.6
BI·M++::Kullan¬m
Kulland¬g¼¬m¬z arayüz ile çok kolay şekilde algortimalar programlanabilir,
Algoritma
R=B, k=1
V=Transpose[R]*R
P=R
While k<kmax
compute
W=A.P
T=Transpose[P].W
T=Inverse[T].V
W=P.T
X+=W
if Norm[B-A.X]<eps break
R=R-A.W
Vold=V
V=Transpose[R].R
Vold=Inverse[Vold].V
P=R+P.Vold
End while
R=B; k=1;
V=t(R)*R;
P=R;
while (k<kmax){
W=A*P;
T=t(P)*W;
T=i(T)*V;
W=P*T;
X+=W;
if(damax(B-A*X)<eps) break();
R=R-A*W;
Vold=V;
V=t(R)*R;
Vold=i(Vold)*V;
P=R+P*Vold;
}
Örnek program,
#include "KEYcpplapack.h" //LAPACK ’i kullanmak için
eklenmeli
#include "bimpp.h" //BI·M++’¬kullanmak için
/*! main */
int main(int argc, char** argv)
{
int M=10;
int N=5;
GeM A(M,M); //Genel reel de¼
gerli bir matris
A(0,0)=A(0,3)=A(0,4)=A(0,6)=A(0,9)=0;
A(0,1)=A(0,2)=A(0,5)=A(0,7)=A(0,8)=1;
15
A(1,0)=A(1,1)=A(1,3)=A(1,4)=A(1,7)=A(1,9)=0;
A(1,2)=A(1,5)=A(1,6)=A(1,8)=1;
A(2,4)=A(2,8)=A(2,9)=0;
A(2,0)=A(2,1)=A(2,2)=A(2,3)=A(2,5)=A(2,6)=A(2,7)=1;
A(3,0)=A(3,4)=A(3,5)=A(3,8)=A(3,9)=0;
A(3,1)=A(3,2)=A(3,3)=A(3,6)=A(3,7)=1;
A(4,0)=A(4,1)=A(4,3)=A(4,4)=A(4,5)=A(4,6)=A(4,7)=0;
A(4,2)=A(4,8)=A(4,9)=1;
A(5,2)=A(5,3)=A(5,4)=A(5,5)=0;
A(5,0)=A(5,1)=A(5,6)=A(5,7)=A(5,8)=A(5,9)=1;
A(6,0)=A(6,2)=A(6,4)=A(6,6)=0;
A(6,1)=A(6,3)=A(6,5)=A(6,7)=A(6,8)=A(6,9)=1;
A(7,2)=A(7,3)=A(7,4)=A(7,6)=0;
A(7,0)=A(7,1)=A(7,5)=A(7,7)=A(7,8)=A(7,9)=1;
A(8,3)=A(8,5)=A(8,6)=A(8,8)=0;
A(8,0)=A(8,1)=A(8,2)=A(8,4)=A(8,7)=A(8,9)=1;
A(9,0)=A(9,1)=A(9,4)=A(9,5)=A(9,6)=A(9,8)=A(9,9)=0;
A(9,2)=A(9,3)=A(9,7)=1;
A=A*t(A); //A=A*Transpose(A)
GeM B(M,N);
B(0,2)=B(1,1)=B(2,0)=B(2,3)=B(2,4)=1;
B(6,0)=B(6,1)=B(6,2)=B(7,3)=B(8,4)=1;
B(9,0)=B(9,1)=B(9,2)=B(9,3)=B(9,4)=1;
double eps=0.001;
int kmax=10;
////////call dgesv////////
GeM A_c(A); //A ve B’nin kopyalar¬n¬al¬yoruz çünkü üzerlerine yaz¬lacak
GeM B_c(B);
A_c.dgesv(B_c); //LAPACK fonksiyonu
cout << "X=nn" << B_c << endl;
///BI·M++ fonksiyonlar¬n¬ça¼
g¬ral¬m////
//////call Block_CG/////
Bcg(A,B,eps,kmax);
cout << "Çözüm CG=nn" << B<< endl;
//////call Block_BCG/////
Bbcg(A,B,B,eps,kmax);
cout << "Çözüm BCG=nn" << B<< endl;
16
//////call Block_BICGSTAB/////
Bbicgstab(A,B,B,eps,kmax);
cout << "Çözüm BICGSTAB/=nn" << B<< endl;
//////call Block_GMRES/////
Bgmres(A, B);
cout << "Çözüm GMRES=nn" << B<< endl;
return 0;
}
Make…le dosyas¬cygwin için
CPP = g++
COMP_FLAGS = -O2 -Wall -Wno-unknown-pragmas #-pg
CPPLAPACK_INCLUDE_DIR = $(HOME)/cpplapack/include
#ATL_LIB_DIR = $(HOME)/LIB/lapack-3.1.1/atlas/lib
INCLUDE_DIRS = -I$(CPPLAPACK_INCLUDE_DIR)
#LIB_DIRS = -L$(ATL_LIB_DIR)
#FLAGS=-static #allows matrices larger than stack size
LIB=-L/lib/
LIB_LAPACK=-llapack -lblas -lm
OBJECTS = main.o
#############################
A.OUT: $(OBJECTS) bim.cpp
$(CPP) $(OBJECTS) $(LINK_FLAGS) $(LIB) $(LIB_LAPACK)
-o $@
.SUFFIXES: .cpp .o
.cpp.o:
$(CPP) -c $< $(COMP_FLAGS) $(INCLUDE_DIRS)
$(MACROS)
run: A.OUT
./A.OUT
clean:
rm -f *~$(OBJECTS) A.OUT
4
Gelecek...
Önkoşulland¬r¬c¬lar (preconditioners) kullan¬lmas¬Krylov metotlar¬için çok
önemlidir. Bu yüzden BI·M++’¬önkoşulland¬r¬c¬kullan¬r hale getirmeyi plan17
l¬yoruz. Çok çekirdekli işlemcilerin ç¬kmas¬ile ekstra çekirdeklerin kullan¬lmas¬çok önemli hale geldi. Bizde TBB3 kütüphanesini kullanarak BI·M++’¬n
performans¬n¬artt¬rmay¬planl¬yoruz.
Kaynaklar
[Bai95]
Bai, Z et. al., LAPACK Lapack Users’Guide, SIAM, 1995
[Bar94]
Barrett R. et al., Templates for the Solution of Linear Systems:
Building Blocks for Iterative Methods, SIAM Software Environments Tools, 1994
[BDJ03] Baker A. H., Dennis J. M., Jessup E. R., An E¢ cient Block Variant of GMRES, Report CU-CS-945-03, University of Colorado,
Department of Computer Science, 2003
[BuTu92] Buchanan J. L., Turner P. R., Numerical Methods and Analysis,
McGraw-Hill, 1992
[DDSV98] Dongarra J., Du¤ I. S., Sorensen D. C., Van Der Vorst H. A.,
Numerical Linear Algebra for High-Performance Computers,
SIAM Software Environments Tools, 1998
[Din07]
Dinler A., Navier-Stokes denklemlerinin Blok Krylov tekni¼
gi ile
·
paralel çözümü, Yüksek Lisans Tezi ITÜ, 2007
[Don03]
Dongarra J. et al., Sourcebook of Parallel Computing, Morgan
Kaufmann Publishers, 2003
[Gre97]
Greenbaum A., Iterative Methods for Solving Linear Systems,
SIAM Frontiers in Applied Mathematics, 1997
[Kel95]
Kelley C. T., Iterative Methods for Linear and Nonlinear Equations, SIAM Frontiers in Applied Mathematics, 1995
[Li97]
Li G., A block Variant of the GMRES Method on Massively Parallel Processors, Parallel Computing, 23 (1997), pp. 1005-1019
[Oni05]
Onishi Y.,CPPLapack C++ class wrapper for BLAS and LAPACK, yaz¬l¬m paketi, http://cpplapack.sourceforge.net/
3
Threading Building Blocks kütüphanesi. Intel’in çok çekirdekli sistemlerin verimli şekilde kullan¬lmas¬ için ç¬kard¬g¼¬ aç¬k kaynak kodlu bir C++ kütüphanesi.
wwww.threadingbuildingblocks.org
18
[Saa96]
Saad Y., Iterative Methods for Sparse Linear Systems, PWS Publishing Company, 1996
[Str97]
Stroustrup B., The C++ Programming Language, Addison-Wesley
Professional, 1997
[VeJe97] Veldhuizen T. L.,Jernigan M. E., Will C++ be faster than Fortran?, Proceedings of the 1st International Scienti…c Computing in Object Oriented Parallel Environments (ISCOPE’97),
1997
5
EK
19
Blok Conjugate Gradient
Bcg
{
Code
4-22
cout << "############ Block CG ############" << endl;
double dif;
int M=B.m;
int N=B.n;
Tplt X(M,N);
Tplt R(M,N);
Tplt V(N,N);
Tplt Vold(N,N);
Tplt P(M,N);
Tplt W(M,N);
Tplt T(N,N);
R=B;
V=t(R)*R;
P=R;
int k=1;
While
23-23
while(k<kmax)
Code
25-31
W=A*P;
T=t(P)*W;
T=CPPL::i(T)*V;
W=P*T;
X+=W;
R=B-A*X;
dif=damax(R);
IF
32-32
if(dif<0)
Code
32-32
dif=-dif;
IF
33-33
if(dif<eps)
Break
35-35
break;
Code
37-42
R=P-A*W;
Vold=V;
V=t(R)*R;
Vold=CPPL::i(Vold)*V;
P=R+P*Vold;
k++;
Code
44-52
B=X;
X.clear();
R.clear();
V.clear();
Vold.clear();
P.clear();
W.clear();
T.clear();
Return
54-54
return 1;
End
55-55
Blok Bi-conjugate Gradient Stabilized
Bbicgstab
4-4
{
Code
6-22
cout << "############ Block Bi-CGSTAB ############" << endl;
double dif;
double w;
int M=B.m;
int N=B.n;
Tplt X(M,N);
Tplt R(M,N);
Tplt alpha(N,N);
Tplt P(M,N),V(M,N);
Tplt T(M,N),S(M,N);
Tplt temp1(N,N),temp2(N,N),temp3(N,N),temp4(N,N);
R=B;
P=R;
int k=1;
While
23-23
while(k<kmax)
Code
25-36
V=A*P;
temp3=t(Rt)*V;
temp4=CPPL::i(temp3)*t(Rt);
alpha=temp4*R;
S=R-V*alpha;
T=A*S;
temp1=t(T)*S;
temp2=t(T)*T;
w=(tr(temp1)/tr(temp2));
X=X+P*alpha+w*S;
R=S-w*T;
dif=damax(R);
IF
37-37
if(dif<0)
Code
37-37
dif=-dif;
IF
38-38
if(dif<eps)
Break
40-40
break;
Code
42-45
temp4=temp4*T;
P=P-w*V;
P=R-P*temp4;
k++;
Code
47-59
B=X;
X.clear();
R.clear();
alpha.clear();
P.clear();
V.clear();
T.clear();
S.clear();
temp1.clear();
temp2.clear();
temp3.clear();
temp4.clear();
Return
61-61
return 1;
End
62-62
Blok GMRES
Bgmres
3-3
{
Code
5-21
cout << "############ Block GMRES ############" << endl;
cout << "A=\n" << A << endl;
int M=B.m;
int N=B.n;
int mn=M/N;//!!
Tplt W(M,N);
Tplt Htemp(N,N);
Tplt H(M+N,M);
Tplt VM(M,M+N);
Tplt bE(M+N,M);
Tplt R(M,M);
Tplt * v = new Tplt[mn+1];
v[0]=B;
qqr(v[0]);
cout << "v(0)=\n" << v[0] << endl;
For
23-23
for(int j=0;j<mn;j++)
Code
24-25
W=A*v[j];
cout << "W=\n" << W << endl;
For
26-26
for(int i=0;i<=j;i++)
Code
27-30
Htemp=t(v[i])*W;
cout << "Htemp=\n" << Htemp << endl;
//-------------------int jjj=0;
int jjj=0;
For
31-38
for(int jj=j*N;jj<(j+1)*N;jj++){
int iii=0;
for(int ii=i*N;ii<(i+1)*N;ii++){
H(ii,jj)=Htemp(iii,jjj);
iii=iii+1;
}
jjj=jjj+1;
}
Code
40-41
W-=v[i]*Htemp;
cout << "W=\n" << W << endl;
Code
43-48
qr(W,Htemp);
v[j+1]=W;
cout << "v[j+1]=\n" << v[j+1] << endl;
cout << "H(j+1,j) =\n" << Htemp << endl;
//-------------------int jjj=0;
For
49-49
for(int jj=j*N;jj<(j+1)*N;jj++)
Code
50-50
int iii=0;
For
51-54
for(int ii=(j+1)*N;ii<(j+2)*N;ii++){
H(ii,jj)=Htemp(iii,jjj);
iii=iii+1;
}
Code
55-55
jjj=jjj+1;
Code
59-63
Htemp.clear();
W.clear();
cout << "H=\n" << H << endl;
Tplt B_c(B);
For
64-64
for(int i=0;i<mn+1;i++)
Code
66-66
int jjj=0;
For
67-67
for(int jj=i*N;jj<(i+1)*N;jj++)
For
68-70
for(int ii=0;ii<M;ii++){
VM(ii,jj)=v[i](ii,jjj);
}
Code
71-71
jjj=jjj+1;
Code
76-83
cout << "VM=\n" << VM << endl;
bE=t(VM)*B_c;
qr(H,R);
B_c=t(H)*bE;
B=CPPL::i(R)*B_c;//Backsubsition necessary
bE.clear();
VM.clear();
H.clear();
For
84-84
for(int i=0;i<mn;i++)
Code
86-86
int jjj=0;
For
87-87
for(int jj=i*N;jj<(i+1)*N;jj++)
For
88-90
for(int ii=0;ii<M;ii++){
R(ii,jj)=v[i](ii,jjj);
}
Code
91-91
jjj=jjj+1;
Code
96-99
B=R*B;
96-99
B=R*B;
cout << "SOL=\n" << B<< endl;
R.clear();
delete [] v;
Return
101-101
return 1;
End
102-102
Download