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