2012-03-21 35 views
13

Gần đây tôi đã phát hiện ra việc sử dụng các hàm thuần túy và các chương trình con trong Fortran. Từ những gì mà cẩm nang của Fortran chỉ ra, có vẻ như hầu hết các chương trình con của tôi có thể được định nghĩa là thuần túy (vì tôi luôn xác định ý định của tất cả các đối số, và thường là tôi không có "save", "pause", hoặc I/O bên ngoài) trong hầu hết các chương trình con của tôi). Câu hỏi của tôi là: Tôi có nên làm điều đó không? Tôi đã tự hỏi nếu trình biên dịch tối ưu hóa các chương trình con tinh khiết tốt hơn hoặc nếu nó chỉ không quan trọng, hoặc nếu nó có thể làm cho mọi việc tồi tệ hơn. Cảm ơn!Các chương trình con thuần túy ở Fortran - Tối ưu hóa biên dịch

Trả lời

19

Bạn làm việc với trình biên dịch để tạo mã tốt và thông tin bạn cung cấp trình biên dịch càng tốt hai bạn có thể làm cùng nhau.

Cho dù đó là dán nhãn với intent(in) bất kỳ đối số giả bạn không thay đổi, hoặc sử dụng parameter cho hằng số, hoặc một cách rõ ràng làm pure bất kỳ chương trình con mà không có bất kỳ tác dụng phụ, hoặc sử dụng forall khi bạn không thực sự quan tâm trật tự một vòng lặp được tính bằng, bằng cách rõ ràng hơn về những gì bạn muốn xảy ra, bạn được hưởng lợi vì:

  • trình biên dịch bây giờ có thể cờ nhiều lỗi tại thời gian biên dịch - hey, bạn đã chỉnh sửa mà đối số bạn nói là ý định 'trong' hoặc bạn đã sửa đổi biến mô-đun đó trong một chương trình con thuần túy
  • mã của bạn là c learer để người tiếp theo đến với nó mà không biết những gì nó phải làm (và người đó cũng có thể là bạn ba tháng sau)
  • trình biên dịch có thể tích cực hơn với tối ưu hóa (nếu trình biên dịch có một bảo đảm từ bạn rằng sẽ không có gì thay đổi, nó có thể làm tối ưu hóa việc tối ưu hóa).

Trong ba lợi ích đó, tối ưu hóa có lẽ không phải là quan trọng nhất; trong trường hợp các chương trình con thuần túy, một trình biên dịch thông minh có thể thấy chỉ qua phân tích tĩnh mà chương trình con của bạn không có tác dụng phụ. Tuy nhiên, càng có nhiều sự đảm bảo, bạn có thể cung cấp cho nó, công việc tốt hơn nó có thể làm để tối ưu hóa mã của bạn trong khi vẫn duy trì tính chính xác.

+1

Tôi chỉ thêm rằng sử dụng 'do concurrent' hiện được đề xuất trên' forall'. Xem ví dụ [trang 23 của tài liệu Intel này] (https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDIQFjAB&url=https%3A%2F%2Fsoftware.intel. com% 2Fsites% 2Fdefault% 2Ffiles% 2Fparallel_mag_issue11.pdf & ei = OIxIVYjaIcb0UufjgcAL & usg = AFQjCNFwOikfX3mcuuFfRSQIjIuNj_UZBA & sig2 = 6d9TpqMl_8BCKU2ePIli5g & bvm = bv.92291466, d.d24). – max

+1

Bạn có thể sử dụng từ khóa 'pure' làm công cụ dò tìm tác dụng phụ. Chỉ cần khai báo tất cả các hàm bạn viết là 'pure'. Nếu hàm có tác dụng phụ thì trình biên dịch sẽ phàn nàn. Nếu điều đó xảy ra, hãy suy nghĩ xem bạn có thể cấu trúc lại nó thành tác dụng phụ không, nếu không thì thả 'thuần túy'. Bằng cách đó bạn sẽ hiểu rõ hơn về mã của bạn và tự động viết mã sạch hơn. – user26756

4

Theo như tôi biết, điều đó không quan trọng trong chế độ tuần tự. Nhưng nếu bạn kích hoạt các tùy chọn "tự động song song", thì trình biên dịch đôi khi có thể tận dụng khai báo PURE cho các vòng lặp song song (đa luồng) có chứa các cuộc gọi đến các chương trình con thuần túy (nó không thể chịu rủi ro nếu các chương trình con không thuần túy). Vì lý do tương tự, khai báo PURE cũng hữu ích cho lập trình viên muốn đặt chỉ thị // theo cách thủ công (ví dụ OpenMP) vì nguy cơ gặp rắc rối với các thủ tục như vậy là khá hạn chế. Thường có thể song song các vòng lặp với các cuộc gọi đến các chương trình con không thuần túy, nhưng điều này cần xác minh sâu ...

+2

Nhưng mặt khác, trình biên dịch có thể sẽ không song song bất kỳ thứ gì bên trong các chương trình con thuần túy, vì vậy hãy cẩn thận. –

Các vấn đề liên quan