2011-12-22 16 views
6

forall Dinamik diziler tahsis etmek forall kullanmaya çalıştı ama gfortran böyle değildi. Ayrıca forall bloğunda write ifadelerinin yasaklandığını ve read ifadelerinin de olduğundan şüpheleniyorum. Fortran kısıtlamalar

başka hangi işlevleri/işlemleri bir forall bloğunda izin verilmez?

Tam bu sırası önemli değildir bazen do döngüler değiştirdirmiştir için ne inşa edilir? Kodlamayı daha okunaklı ve zarif hale getireceğini, özellikle de operasyon sırasının ne zaman önemli olduğunu göstermediğini, ancak forall içinde hangi işlemlerin yapılabileceği konusunda oldukça kısıtlayıcı olacağını düşündüm.

bu kısıtlamaların nedenleri onlar kadar karışıklık engel olacak olduklarımızı korumak/do yani nelerdir? forall'u kullanmak iyi bir fikir mi? Eğer öyleyse, ne amaçla?

Şu an üzerinde çalıştığım kodda sadece bir tane forall blok var, ve eğer hepsini do döngülerinde tercüme ettiysem, dört tane iç içe geçmiş döngüsü verecekti. Hangi yol daha iyi?

cevap

11

günümüzde FORALL ve WHERE yapıları için çok ihtiyaç yoktur. Kodlamanın hızlandırılması HPC'de önemli bir şey olduğunda, çoğunlukla optimizasyon amacıyla Fortran 95'in bir parçası olarak (Fortran 90'a küçük uzantı) dahil edildi. Uygulamada FORALL'un bu kadar sınırlı olmasının nedeni, tam olarak, döngü optimizasyonu için tasarlandığından. Ayrıca, FORALL'un döngü yapısı değil, ataması olduğunu unutmayın. Böylece, blok içinde sadece atama ifadelerine izin verilir. Teorik olarak, DO döngüler, işlemcinin döngü içinde olacağı dizin sırasına ilişkin açık yönergeler verir. Bir FORALL yapısı, derleyicinin dizinin bellekte nasıl depolandığına bağlı olarak en uygun sırayı seçmesini sağlar. Ancak, bu, zaman içinde anlamını yitirmiştir, çünkü modern derleyiciler DO döngü vektörlerinde çok iyidir ve FORALL kullanarak herhangi bir gelişme fark etmeyeceksiniz.

FORALL ve here

kod performansı hakkında endişe duyuyorsanız WHERE güzel bir tartışma bakın, yerine farklı bir derleyici düşünebilirsiniz - PGI veya ifort. Kendi deneyimimden, gfortran geliştirme için uygun, ancak HPC için değil. Pgf90 veya ifort ile derlenmiş kod ile birkaç kez daha hızlı yürütme fark edeceksiniz.

+0

Teşekkürler, çok açık bir şekilde yaptınız. –

6

Forall yapı gerçekten çok sınırlayıcı olduğu kanıtlanmıştır ve tek dizi işlemleri için oldukça yararlıdır. Kesin sınırlamalar için bkz. IBM Fortran - FORALL. Daha az kısıtlayıcı olan Fortran 2008'in do concurrent yapısıdır. Hatta read ve write ifadelerine izin verilir. Bkz. Intel Fortran - DO CONCURRENT ve New features of Fortran 2008.

+0

Yine de pek çok derleyici Fortran 2008'i desteklemiyor. Ben gfortran kullanıyorum, en son kararlı sürüm (4.6?) –

+1

Gfortran 4.6 bunun bir parçası olarak http://fortranwiki.org/fortran/show/Fortran+2008+status ve http://gcc.gnu.org/ onlinedocs/gfortran/Fortran-2008-status.html, en yeni gfortranda "eşzamanlı" yapmak için destek iddia ediyor. –

+0

Bunu nasıl yapacağımı öğrenmeliyim. –

İlgili konular