2012-07-04 17 views
7

Tôi có câu hỏi sau đây: Chi phí thực sự của phân bổ/deallocate báo cáo trong Fortran90 + là gì? Tức là, một số mảng vừa được phân bổ bên trong một vòng lặp, nhưFortran phân bổ/deallocate

do i = 1, 1000 
    allocate(tmp(20)) 
    tmp(1:20) = 1d0 
    call foo(tmp) 
    deallocate(tmp) 
end do 

Có đáng phân bổ một mảng tác phẩm duy nhất dựa trên kích thước tối đa trong trường hợp này?

+1

Liệu có tiết kiệm đáng chú ý hay không tùy thuộc vào thời gian "foo" chạy. Thay đổi có đáng giá không? Của nó hoặc là một vấn đề của ý kiến, hoặc bạn nên đo thời gian chạy trên trình biên dịch và máy của bạn. Thay đổi có làm cho mã ít đọc được hơn không? Nếu vậy, có đáng để tiết kiệm mili giây thời gian chạy không? giây? –

Trả lời

6

Tôi nhận thấy rằng phân bổ mảng động trong vòng lặp chặt chẽ có thể thực sự làm chậm quá trình thực thi mã của tôi, với valgrind cho thấy rằng một tỷ lệ lớn các chu kỳ được thực hiện bởi mallocfree. Vì vậy, nếu foo là một hàm rất nhanh, thì sẽ có giá trị phân bổ tĩnh mảng này. Thật dễ dàng để xem chi phí này bằng cách sử dụng chức năng callgrind của valgrind (có thể giảm giá trị của vấn đề của bạn vì việc thực hiện lược tả có thể chậm hơn ít nhất 10 lần).

Trong fortran 2008, có một giải pháp tốt hơn cho loại sự cố này. Bạn có thể khai báo các biến của mình bên trong một cấu trúc block với kích thước được xác định tại thời gian chạy. Điều này sẽ giúp cho trình biên dịch phân bổ biến dễ dàng hơn trên ngăn xếp. Tuy nhiên tôi đã không sử dụng cá nhân này và tôi không chắc chắn mà trình biên dịch hỗ trợ nó.

+0

Lưu ý: gfortran [hỗ trợ cấu trúc khối] (http://fortranwiki.org/fortran/show/Fortran+2008+status) – max

3

Các nguyên cần thiết của việc sử dụng ALLOCATEDEALLOCATE cũng giống như các nguyên cần thiết của việc sử dụng malloc()free() trong C. Trên thực tế hầu hết các trình biên dịch Fortran thực hiện (DE)ALLOCATE như hàm bao quanh malloc()/free() với một số sổ sách kế toán thêm, vốn có cho tất cả 90 mảng Fortran.

Thông thường, tốt hơn là preallocate một mảng đầu đủ lớn và sử dụng nó trong vòng chặt chẽ thay vì liên tục phân bổ và giải phóng bộ nhớ. Nó cũng giữ cho heap không bị phân mảnh mà có thể dẫn đến các vấn đề phân bổ sau này (tình trạng rất hiếm nhưng nó xảy ra, đặc biệt là với các mã 32 bit).

+0

Tại sao có mã 32 bit? – Rook

+2

Vì mã 32 bit có quyền truy cập chỉ 2 GiB không gian địa chỉ ảo của người dùng (hoặc 4 GiB trên OS X) được chia sẻ giữa các tệp heap, stack và bộ nhớ ánh xạ và với phân đoạn bị phân mảnh nặng, có thể không đủ không gian liên tục lớn cung cấp phân bổ thêm các khối lớn. –