2011-12-22 32 views
6

Tôi đã cố sử dụng forall để phân bổ mảng động nhưng gfortran không thích điều đó. Tôi cũng phát hiện ra rằng các câu lệnh write bị cấm trong một khối forall và tôi cũng nghi ngờ các câu lệnh read cũng vậy.Hạn chế forall của Fortran

Các chức năng/hoạt động nào khác không được phép trong khối forall?

Chính xác cấu trúc này là gì, ngoài ra đôi khi thay thế các vòng do khi đơn đặt hàng không quan trọng? Tôi nghĩ rằng nó sẽ làm cho mã hóa dễ đọc hơn và thanh lịch, đặc biệt là hiển thị khi thứ tự của các hoạt động không quan trọng, nhưng nó có vẻ khá hạn chế với những gì các hoạt động có thể được thực hiện bên trong một forall.

Lý do cho những hạn chế này, nghĩa là những gì họ bảo vệ/ngăn người dùng thoát khỏi sự cố? Sử dụng forall có tốt không? Nếu có, cho mục đích gì?

Ngay bây giờ trong mã tôi đang làm việc trên chỉ có một khối forall và nếu tôi dịch tất cả trong các vòng do, nó sẽ cung cấp bốn vòng lồng nhau. Cách nào tốt hơn?

Trả lời

11

Hiện không cần nhiều thiết bị FORALLWHERE. Chúng được giới thiệu như là một phần của Fortran 95 (phần mở rộng nhỏ cho Fortran 90), chủ yếu cho mục đích tối ưu hóa, khi vector hóa mã là một điều quan trọng trong HPC. Lý do mà FORALL bị hạn chế trong ứng dụng là chính xác vì nó được thiết kế để tối ưu hóa vòng lặp. Cũng lưu ý rằng, FORALL không phải là cấu trúc vòng lặp, nhưng gán. Vì vậy, chỉ có các câu lệnh gán được cho phép bên trong khối. Về lý thuyết, DO vòng cung cấp hướng dẫn rõ ràng về thứ tự các chỉ mục mà bộ xử lý sẽ lặp lại. Cấu trúc FORALL cho phép trình biên dịch chọn thứ tự tối ưu nhất dựa trên cách mảng được lưu trữ trong bộ nhớ. Tuy nhiên, điều này đã mất đi ý nghĩa theo thời gian, vì các trình biên dịch hiện đại rất tốt ở các vectơ vòng lặp DO và bạn không có khả năng nhận thấy bất kỳ cải tiến nào bằng cách sử dụng FORALL.

Xem một cuộc thảo luận tốt đẹp trên FORALLWHEREhere

Nếu bạn đang lo lắng về hiệu suất mã, bạn có thể muốn xem xét chứ không phải một trình biên dịch khác nhau - PGI hoặc ifort. Từ kinh nghiệm của riêng tôi, gfortran phù hợp để phát triển, nhưng không thực sự cho HPC. Bạn sẽ nhận thấy việc thực hiện nhanh hơn nhiều lần với mã được biên dịch bằng pgf90 hoặc ifort.

+0

Cảm ơn bạn, bạn đã làm cho nó khá rõ ràng. –

6

Forall xây dựng được chứng minh là thực sự quá hạn chế và chủ yếu chỉ hữu ích cho các hoạt động mảng. Để biết giới hạn chính xác, hãy xem IBM Fortran - FORALL. Ít hạn chế hơn là cấu trúc do concurrent của Fortran 2008. Ngay cả các tuyên bố readwrite đều được phép ở đó. Xem Intel Fortran - DO CONCURRENTNew features of Fortran 2008.

+0

Chưa có nhiều trình biên dịch hỗ trợ Fortran 2008. Tôi đang sử dụng gfortran, phiên bản ổn định mới nhất (4.6?) –

+1

Gfortran 4.6 có hỗ trợ một phần của nó http://fortranwiki.org/fortran/show/Fortran+2008+status và http://gcc.gnu.org/ onlinedocs/gfortran/Fortran-2008-status.html, tuyên bố hỗ trợ cho 'làm đồng thời' trong gfortran mới nhất. –

+0

Tôi nên học cách làm điều đó. –