2012-08-28 39 views
5

Chương trình này bị treo với Illegal instruction: 4 trên MacOSX Lion và ifort (IFORT) 12.1.0 20111011sụp đổ Chương trình cho mảng sao chép với ifort

program foo 
     real, pointer :: a(:,:), b(:,:) 
     allocate(a(5400, 5400)) 
     allocate(b(5400, 3600)) 
     a=1.0 
     b(:, 1:3600) = a(:, 1:3600) 

     print *, a 
     print *, b 

     deallocate(a) 
     deallocate(b) 

end program 

Chương trình cùng làm việc với gfortran. Tôi không thấy vấn đề gì cả. Bất kỳ ý tưởng? Việc hủy bỏ bản sao và thực hiện vòng lặp rõ ràng trên các cột hoạt động trong cả hai trình biên dịch.

Lưu ý rằng với phân bổ thay vì con trỏ, tôi không có vấn đề gì.

Hành vi là như nhau nếu tuyên bố nằm trong mô-đun hay không. tôi khẳng định hành vi tương tự trên ifort (IFORT) 12.1.3 20120130.

Rõ ràng, không có vấn đề xảy ra với Linux và ifort 12.1.5

tôi đã cố gắng để tăng kích thước ngăn xếp với các tùy chọn liên kết sau

ifort -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 test.f90

nhưng tôi vẫn gặp lỗi tương tự. Tăng ulimit -s lên cùng một vấn đề.

Chỉnh sửa 2: Tôi đã làm một số sửa lỗi hơn và rõ ràng các vấn đề xảy ra khi hoạt động mảng nối

 b(:, 1:3600) = a(:, 1:3600) 

liên quan đến một giá trị đáng ngờ gần 16 M của dữ liệu.

Tôi đang so sánh các mã được sản xuất, nhưng nếu có cách để xem biểu mẫu mã trung gian có tính giao tiếp cao hơn, tôi sẵn sàng đánh giá cao nó.

+0

Tôi cũng nhận được "hướng dẫn bất hợp pháp" với ifort 12.1.1.246 trên Mac Snow Leopard. Tôi đề nghị báo cáo trên Diễn đàn Intel Fortran hoặc gửi báo cáo lỗi. Có lẽ nó được cố định trong 12.1.5? –

+0

Và tôi nhận được nó với ifort 12.0.3 trên Mac Snow Leopard. Có lẽ lỗi này đã ở đó một chút ... – EMiller

+0

Rõ ràng, vấn đề tồn tại trên (một số) hộp linux là tốt: mã segfaults trên CentOS 5.5 và ifort 12.1. –

Trả lời

1

Sử dụng "phân bổ" thay vì "con trỏ".

sản, allocatable :: a (:, :), b (:, :)

Gán một số dấu chấm động đến một con trỏ trông đáng ngờ đối với tôi.

+2

Không có gì sai khi gán một số cho con trỏ được cấp phát trong fortran.Các con trỏ Fotran không giống như con trỏ C, và ngoài toán tử => và nội trang được liên kết hoạt động chủ yếu giống như các mảng được phân bổ. – amaurea

4

Chương trình của bạn là chính xác (mặc dù tôi muốn phân bổ cho con trỏ nếu bạn không cần phải có khả năng thay thế nó). Vấn đề là ifort theo mặc định đặt tất cả các chuỗi thời gian trên stack, không có vấn đề lớn như thế nào họ đang có. Và có vẻ như cần một mảng tạm thời cho thao tác sao chép bạn đang làm ở đây. Để làm việc xung quanh hành vi mặc định ngu ngốc của ifort, luôn luôn sử dụng cờ heap-arrays khi biên dịch. I E.

ifort -o test test.f90 -heap-arrays 1600 

Số đằng sau các mảng-đống là ngưỡng bắt đầu sử dụng vùng lưu trữ. Đối với các kích thước dưới đây, ngăn xếp được sử dụng. Tôi đã chọn một con số khá thấp ở đây - bạn có thể sử dụng một cách an toàn những con số cao hơn. Trong lý thuyết mảng stack nhanh hơn, nhưng sự khác biệt thường hoàn toàn không đáng kể. Tôi muốn intel sẽ khắc phục hành vi này. Mỗi trình biên dịch khác có mặc định hợp lý cho cài đặt này.

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