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
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.
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 ...
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. –
- 1. Tối ưu hóa trình biên dịch Erlang
- 2. tối ưu hóa bởi trình biên dịch trong một chương trình đệ quy
- 3. C tối ưu hóa cấu trúc trình biên dịch
- 4. C++ 0x tối ưu hóa chất lượng trình biên dịch
- 5. Cách tắt trình biên dịch tối ưu hóa của V8
- 6. Trình biên dịch C/C++ có tối ưu hóa trên các đơn vị biên dịch không?
- 7. Trình biên dịch có tối ưu hóa điều này không
- 8. Cách biên dịch chương trình C mà không cần bất kỳ tối ưu hóa nào
- 9. Ở mức độ nào trình biên dịch C# hoặc JIT tối ưu hóa mã ứng dụng?
- 10. Cách tốt nhất để mở rộng API chrome mở rộng, để làm việc với Trình biên dịch Tối ưu hóa Trình biên dịch Tối ưu hóa?
- 11. Làm cách nào để tối ưu hóa từ "hàm thuần túy" trong C#?
- 12. Tối ưu hóa trình biên dịch C++ của các đối số đã qua
- 13. Tối ưu hóa trình biên dịch của các loại vô danh
- 14. Các chương trình đã biên dịch có thực sự ở dạng nhị phân thực?
- 15. Tối ưu hóa điểm nổi biên dịch GCC
- 16. Khái niệm về "xóa mã chết" trong các tùy chọn tối ưu hóa trình biên dịch
- 17. Các kỹ thuật tối ưu hóa trình biên dịch C++ trong Visual studio
- 18. Có các trình biên dịch C++ được tối ưu hóa để sử dụng mẫu không?
- 19. Ngăn xếp tràn trên cuộc gọi chương trình con chỉ khi được biên dịch với Intel Visual Fortran và tiền phạt khi biên dịch bởi Compaq Visual Fortran
- 20. Gọi C chức năng/chương trình con trong mã Fortran
- 21. C# làm chuỗi chữ được tối ưu hóa bởi trình biên dịch?
- 22. Trình biên dịch C# có đủ thông minh để tối ưu hóa mã này không?
- 23. Trình biên dịch tối ưu hóa chức năng giai thừa này như thế nào?
- 24. Biên dịch và tối ưu hóa cho các kiến trúc đích khác nhau
- 25. Lỗi trình tối ưu hóa hoặc lỗi lập trình?
- 26. Hiệu suất C++, tối ưu hóa trình biên dịch, chức năng trống trong .cpp
- 27. Các tham chiếu khác về cách trình biên dịch Stalin tối ưu hóa một cách tàn bạo?
- 28. Lỗi tối ưu hóa trình biên dịch LLVM hoặc cái gì?
- 29. Trình tối ưu hóa C# và JIT làm những loại tối ưu nào?
- 30. trình biên dịch tối ưu hóa cho sự ổn định số
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
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