2016-12-08 17 views
6

Tôi đã cố chuyển một mảng tới một chương trình con, được khai báo trong chương trình con như một mảng hình dạng giả định. Điều đó đã cho tôi một số vấn đề mà tôi đã có thể giải quyết bằng cách đi qua một con trỏ để thay thế.Con trỏ có ức chế tối ưu hóa trình biên dịch không?

Nhưng một số người dùng với một danh tiếng cao nói với tôi trong một chú thích:

Thêm trỏ cũng là một cách hợp lý nói với trình biên dịch optimizer rằng nó không phải làm bất kỳ công việc ngày hôm nay.

Có ai có thể đưa ra giải thích ngắn về vấn đề này không? Ngôn ngữ là Fortran 95, mặc dù tôi tin rằng điều này áp dụng cho các ngôn ngữ khác.

+0

Tôi nghĩ rằng OP đang đề cập đến [nhận xét này] (http://stackoverflow.com/questions/41009109/subroutine-not-returning-correct-numerical-values-in-assumed-shape-array-due-to # comment69272729_41032273). – 4castle

+1

Điều đó đúng. Đối với SIMD, thật khó để đảm bảo rằng dữ liệu được tuần tự cho dù điểm có lập chỉ mục tuần tự hay không. Có thể đúng hơn đối với Fortran so với hầu hết các ngôn ngữ, vì rất nhiều Fortran đang nhắm mục tiêu cụ thể các vectơ/mảng. Nhưng sự can đảm của các trình biên dịch là tất cả nói chung tiếp cận một asymptote nơi lắp ráp có thể được gần giống hệt nhau giữa fortran và c. Nói chung có nghĩa là đối với một số thứ, và mã khó hơn đòi hỏi nhiều công việc hơn. – Holmz

+1

@ 4castle Tôi không bao gồm liên kết đến nhận xét ban đầu về mục đích, vì nó chứa thông tin gây hiểu lầm: (bằng cách sử dụng con trỏ) "bạn không còn có thể vượt qua phần mảng" nữa, điều đó là sai. Không có gì dễ dàng hơn việc gán một con trỏ cho một mảng mảng trước khi chuyển nó thành đối số cho chương trình con. – Mephisto

Trả lời

4

Có, trình biên dịch Fortran phải giả định rằng con trỏ có thể bí danh với các con trỏ khác và với các biến số target.

Nếu bạn có mảng con trỏ ab sau đó trong

a(i) = a(i) + b(i) 

trình biên dịch phải thừa nhận rằng hai mảng này một phần có thể chồng chéo và nó phải ức chế tối ưu hóa nhất định, bởi vì thay đổi giá trị của a có thể thay đổi một số giá trị của b tại một số chỉ mục không xác định.

Xem thêm từ khóa C restrict và thảo luận kỹ lưỡng hơn tại Is Fortran easier to optimize than C for heavy calculations?. Nó không phải là giá trị lặp đi lặp lại tất cả các điểm về con trỏ răng cưa lớn lên ở đó.

Nhận xét của IanH có chủ ý có lẽ hơi quá mạnh, nhưng có rất nhiều sự thật trong đó.

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