Điều gì làm cho Fortran nhanh?


41

Fortran có một vị trí đặc biệt trong lập trình số. Bạn chắc chắn có thể tạo ra phần mềm tốt và nhanh bằng các ngôn ngữ khác, nhưng Fortran vẫn hoạt động rất tốt mặc dù tuổi của nó. Hơn nữa, việc tạo các chương trình nhanh ở Fortran dễ dàng hơn. Tôi đã tạo các chương trình nhanh trong C ++, nhưng bạn phải cẩn thận hơn về những thứ như răng cưa con trỏ. Vì vậy, phải có một lý do cho việc này, và một lý do rất kỹ thuật. Có phải vì trình biên dịch có thể tối ưu hóa nhiều hơn? Tôi thực sự muốn biết chi tiết kỹ thuật, vì vậy nếu tôi sử dụng ngôn ngữ khác, tôi có thể cân nhắc những điều này.

Ví dụ, tôi biết - hoặc vì vậy tôi nghĩ - có một điều là tiêu chuẩn quy định rằng các con trỏ luôn nằm trong bộ nhớ luôn có nghĩa là truy cập bộ nhớ nhanh hơn. Tôi tin rằng bạn có thể làm điều này trong C ++ bằng cách đưa cờ cho trình biên dịch. Bằng cách này, nó giúp biết Fortran làm gì tốt, để nếu sử dụng ngôn ngữ khác, chúng ta có thể bắt chước điều này.


7
Tôi có thể nói rằng đây có thể là một câu hỏi tốt hơn cho stackoverflow, mặc dù tôi nghĩ đó là một câu hỏi hay. Một tìm kiếm nhanh ( stackoverflow.com/search?q=fortran+fast ) dẫn tôi đến câu hỏi này có thể giúp bạn: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
Bạn cần chỉ định loại fortran nào bạn đang sử dụng. Có một sự khác biệt đáng kể giữa 77 và 90+. Tôi giả sử ít nhất 90 nếu chúng ta đang nói về con trỏ ...
qubyte

Tôi luôn đọc về việc Fortran nhanh hơn C. Có thể, nhưng nó nhanh hơn như 2% hay nhanh hơn là 50%?
shuhalo

4
Đó là một huyền thoại đô thị. Trừ khi trình biên dịch có thể sử dụng các hướng dẫn đặc biệt, bạn có thể tối ưu hóa bằng tay hầu hết mọi chương trình, bất kể trình biên dịch, để tạo về cùng một ngôn ngữ máy.
Mike Dunlavey

Câu trả lời:


50

Các nhà thiết kế ngôn ngữ phải đối mặt với nhiều sự lựa chọn. Ken Kennedy nhấn mạnh hai: (1) trừu tượng tốt hơn và (2) mã cấp cao hơn hoặc thấp hơn (ít hơn hoặc giống máy hơn). Trong khi các ngôn ngữ chức năng như Haskell và Scheme tập trung vào ngôn ngữ cũ, các ngôn ngữ điện toán khoa học truyền thống như Fortran và C / C ++ tập trung vào ngôn ngữ sau. Nói rằng một ngôn ngữ nhanh hơn ngôn ngữ khác thường khá sai lệch: mỗi ngôn ngữ có một miền vấn đề mà nó vượt trội. Fortran giá vé tốt hơn trong lĩnh vực mã số dựa trên mảng so với các ngôn ngữ khác vì hai lý do cơ bản: mô hình mảng và nhân chứng của nó.

Mô hình mảng

Lập trình viên Fortran phần lớn làm các thao tác mảng. Do đó, Fortran tạo điều kiện cho một số tối ưu hóa trình biên dịch không có sẵn trong các ngôn ngữ khác. Ví dụ tốt nhất là vector hóa: biết cách bố trí dữ liệu cho phép trình biên dịch gọi các nội tại ở cấp độ lắp ráp qua mảng.

Nhân chứng ngôn ngữ

Mặc dù có vẻ như một ngôn ngữ đơn giản sẽ biên dịch "tốt hơn" so với ngôn ngữ phức tạp hơn, nhưng thực sự không phải vậy. Khi một người viết bằng ngôn ngữ hợp ngữ , không có nhiều trình biên dịch có thể làm được: tất cả những gì nó thấy là các hướng dẫn chi tiết rất tốt. Fortran yêu cầu nhân chứng (do đó, lập trình viên làm việc nhiều hơn) chỉ trong các trường hợp mang lại phần thưởng thực sự cho điện toán dựa trên mảng. Fortran sử dụng các kiểu dữ liệu đơn giản, luồng điều khiển cơ bản và không gian tên hạn chế; ngược lại, nó không cho máy tính biết cách tải các thanh ghi (có thể cần thiết cho thời gian thực ). Nơi Fortran rõ ràng, nó cho phép những thứ như hoàn toàn suy luận kiểu, giúp người mới để bắt đầu. Nó cũng tránh một điều thường làm C chậm:con trỏ đục .

Fortran có thể chậm

Fortran không nhanh cho mọi nhiệm vụ: đó là lý do tại sao không có nhiều người sử dụng nó để xây dựng GUI hoặc thậm chí cho máy tính khoa học không có cấu trúc cao. Khi bạn rời khỏi thế giới của mảng cho đồ thị, cây quyết định và các lĩnh vực khác, lợi thế tốc độ này nhanh chóng biến mất. Xem điểm chuẩn ngôn ngữ máy tính cho một số ví dụ và số.


7
Các vấn đề GUI / IO có thể được giải quyết dễ dàng bằng cách gói Fortran crunching trong một ngôn ngữ "mục đích chung hơn". Tôi thường xuyên sử dụng R cho mục đích này.
mbq

2
bắn ra.alioth.debian.org không còn nữa! Và phiên bản mới có ít thông tin hơn :(
astrojuanlu

23

Thiết kế của Fortran cho phép trình biên dịch thực hiện tối ưu hóa mạnh hơn trong một số trường hợp, tối ưu hóa thường không có sẵn cho C.

Một ví dụ nổi tiếng là việc xử lý răng cưa . Trong Fortran, bạn chỉ có thể truy cập vào một vùng nhớ cụ thể mặc dù biểu tượng cụ thể được liên kết với vùng nhớ đó. Kiến thức này cho phép trình biên dịch sử dụng các thủ thuật thông minh khi đến lúc lưu vào bộ đệm: nó biết liệu một giá trị có khả năng thay đổi hay không. Cho đến F90, điều này đã được xác minh dễ dàng. Khi Fortran 90 được giới thiệu pointers, giả định không còn đúng nữa: bạn có thể truy cập cùng một vùng nhớ thông qua hai (hoặc nhiều) biểu tượng. Đây là lý do tại sao bạn phải chỉ định targetcác mảng bạn muốn giải quyết thông qua con trỏ.

Một sự thật thú vị khác là nhiều cấu trúc cho phép trình biên dịch thực hiện song song mà không cần sự can thiệp của người dùng. Sự xa xỉ như vậy là có thể do "thuyết bất khả tri" tương đối của Fortran như một ngôn ngữ.

Có nhiều thủ thuật tinh vi khác như thế này. Ngoài ra, hãy nhớ rằng không ai sử dụng Fortran ngày hôm nay, ngoại trừ tính toán bằng số, có nghĩa là tính năng cốt lõi và điểm bán của trình biên dịch Fortran là tốc độ mã kết quả. Do đó, các nhà cung cấp tập trung vào điều này.

Tuy nhiên, bạn cũng có thể tạo mã hiệu suất với các ngôn ngữ khác. Tuy nhiên, nó có thể cần sự chăm sóc đặc biệt hoặc sự can thiệp của con người. Tuy nhiên, điểm chung là hiệu suất không phải là vấn đề cho đến khi có vấn đề và thời gian của con người đắt hơn thời gian của máy tính. Vì vậy, thực hành mã hóa nên tập trung vào việc tiết kiệm thời gian của con người, thay vì thời gian của máy tính.


2
Khi máy tính của bạn rơi vào phạm vi> 100 triệu đô la, thời gian của mọi người (học sinh tốt nghiệp) sẽ ngừng trông khá đắt đỏ.
Phil Miller

6
@Novelocrat: Lượng mã mà chạy trên $ 100 triệu máy tính đã được viết bởi giờ người đàn ông không đếm được mà đi cũng vượt quá $ 100 triệu, thậm chí với mức giá sinh viên grad. Hãy nhớ rằng chi phí của một người là gấp đôi thu nhập của nó. Phần còn lại đi vào thuế và tương quan. Ngoài ra, một máy tính không có kinh nghiệm bị cháy. Một người làm, và sẽ thay đổi công việc.
Stefano Borini

1
@StefanoBedom Tôi có một lịch sử lâu dài về PC đã bị cháy ...
N74

1
"Ngoài ra, hãy nhớ rằng không ai sử dụng Fortran ngày hôm nay, ngoại trừ các phép tính số," Fortran = "FORmula TRANslation". Fortran luôn được sử dụng chủ yếu và được thiết kế để tính toán số. Fortran có một phần lớn thời gian của máy tính hiệu năng cao.
dùng21387

Ngày nay, cũng như mọi khi, Fortran được sử dụng cho tất cả các mục đích tương tự - tính toán số.
trình tự

12

Tôi không nghĩ Fortran gần với kim loại (xem câu trả lời khác) nhưng nó có xu hướng tối ưu hóa rất dễ dàng. Các vòng lặp rất đơn giản và ngôn ngữ dễ dàng hỗ trợ các phần mở rộng vector hóa (không sao khi tôi sử dụng nó trong công việc đầu tiên của mình, chúng tôi đã nhắm mục tiêu vào một loạt các vectơ sắt lớn).

Ngoài ra còn có yếu tố quán tính lớn. Rất nhiều mã số có trong Fortran, vì vậy các nhà xây dựng máy chủ và siêu máy tính cao cấp đảm bảo họ viết các trình biên dịch Fortran tối ưu hóa tốt. Trình biên dịch tốt (ngay cả trên các máy thiếu trình biên dịch chất lượng cao), vì vậy người dùng tiếp tục sử dụng Fortran và thậm chí viết mã mới trong đó. Vì vậy, các nhà xây dựng đảm bảo thế hệ tiếp theo của họ có trình biên dịch tốt, v.v ...


8

Hãy cẩn thận của những huyền thoại đô thị ở đây. Nếu hai trình biên dịch tạo cùng mã lắp ráp, thì các chương trình kết quả sẽ có cùng hiệu suất.

Đối với bất kỳ đoạn logic đã cho nào, có một chương trình bằng ngôn ngữ lắp ráp giúp giảm thiểu thời gian thực hiện của nó. Chương trình đó không quan tâm trình biên dịch nào tạo ra nó.

Điều đó nói rằng, các ngôn ngữ được biên dịch tồn tại để làm cho cuộc sống dễ dàng hơn cho các lập trình viên. Một phần chi phí của việc này là họ có thể cám dỗ người dùng sử dụng các tính năng không dẫn đến thời gian thực hiện tối thiểu. Ví dụ điển hình của điều này là newtrong C ++. (Nó có thể chậm đến mức nào - chỉ có ba ký tự?) Nó thực tế cầu xin bạn phân bổ động bộ nhớ và không chú ý đến chi phí thời gian chạy. Nếu đó là những gì bạn muốn làm, điều đó thật tuyệt vời, nhưng Fortran có thể nhanh hơn chỉ vì nó không khiến bạn phải làm điều đó.

Nhưng vượt xa điều đó, tôi chưa bao giờ thấy một chương trình nào, như được viết lần đầu tiên, không có chỗ chính để cải thiện hiệu năng của loại trình biên dịch không bao giờ có thể dọn sạch cho bạn. Lấy một ví dụ, dành một phần lớn thời gian gọi expvà / hoặc loglặp đi lặp lại với cùng một đối số. Một ví dụ khác, gọi DGEMM để nhân ma trận và phát hiện ra rằng một phần lớn thời gian sẽ gọi LSAME chỉ để giải mã các đối số ký tự đầu vào của nó.

Điều này đồng thời với việc mọi người đang nói Fortran nhanh hơn do răng cưa hoặc không kiểm soát vòng lặp. Điều đó giống như nói một chiếc xe buýt do Porsche sản xuất chắc chắn sẽ nhanh hơn một chiếc xe buýt do Chevrolet sản xuất. Cần phải có một chút ý nghĩa thông thường.


4
Tôi không nghĩ nó chỉ là một huyền thoại đô thị. Hỗ trợ của Fortran cho toàn bộ hoạt động mảng, các hàm PURE / ElementAL, vv có thể giúp trình biên dịch dễ dàng tối ưu hóa / vector hóa hoặc thậm chí song song hóa. Ví dụ: xem think Champions.com / 2007/08/14 / . Những gì trình biên dịch thực sự làm là một câu chuyện khác nhau (phụ thuộc vào nhà cung cấp).
stali

@stali: Nó phụ thuộc vào nhiều hơn nhà cung cấp. Nó phụ thuộc vào chương trình được biên dịch. Tôi đã thấy mọi người khái quát từ "tồn tại một chương trình mà Fortran có thể chạy nhanh" đến "Fortran nhanh hơn trên bất kỳ chương trình nào". Nếu bạn chỉ ra điều này, mọi người có thể bắt đầu hem và haw và chẻ sợi tóc, và những gì nó thực sự đi xuống cuối cùng, về cơ bản không có gì nhiều hơn những gì mọi người muốn nghĩ.
Mike Dunlavey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.