Nó không phải là dễ dàng để làm điều đó tự động. Cấu trúc DO CONCURRENT
có forall-header có nghĩa là nó có thể chấp nhận nhiều vòng, định nghĩa biến chỉ mục và mặt nạ. Về cơ bản, bạn cần phải thay thế:
DO CONCURRENT([<type-spec> :: ]<forall-triplet-spec 1>, <forall-triplet-spec 2>, ...[, <scalar-mask-expression>])
<block>
END DO
với:
[BLOCK
<type-spec> :: <indexes>]
!$omp parallel do
DO <forall-triplet-spec 1>
DO <forall-triplet-spec 2>
...
[IF (<scalar-mask-expression>) THEN]
<block>
[END IF]
...
END DO
END DO
!$omp end parallel do
[END BLOCK]
(điều trong dấu ngoặc vuông là không bắt buộc, dựa trên sự hiện diện của các phần tương ứng trong forall-header)
Lưu ý rằng điều này sẽ không hiệu quả như song song một vòng lặp lớn với <iters 1>*<iters 2>*...
các lần lặp độc lập, đó là những gì mà DO CONCURRENT
được mong đợi thực hiện. Lưu ý rằng forall-header cho phép loại-spec cho phép người dùng xác định chỉ mục vòng lặp bên trong tiêu đề và bạn sẽ cần bao quanh toàn bộ nội dung trong cấu trúc BLOCK ... END BLOCK
để bảo toàn ngữ nghĩa. Bạn cũng cần kiểm tra xem vô hướng-mặt nạ-expr có tồn tại ở cuối số forall-header và nếu bạn cũng nên đặt IF ... END IF
bên trong vòng lặp trong cùng.
Nếu bạn chỉ có các bài tập mảng bên trong nội dung của DO CONCURRENT
, bạn cũng có thể chuyển đổi nó thành FORALL
và sử dụng chỉ thị workshare
OpenMP. Nó sẽ dễ dàng hơn nhiều so với ở trên.
DO CONCURRENT <forall-header>
<block>
END DO
sẽ trở thành:
!$omp parallel workshare
FORALL <forall-header>
<block>
END FORALL
!$omp end parallel workshare
Với tất cả ở trên, chỉ hệ thống cách mà tôi có thể nghĩ đến là để có hệ thống đi qua mã nguồn của bạn, tìm kiếm DO CONCURRENT
và cách có hệ thống thay thế bằng một trong các cấu trúc được chuyển đổi ở trên dựa trên nội dung của forall-header và thân vòng lặp.
Chỉnh sửa: Sử dụng chỉ thị OpenMP workshare
hiện không được khuyến khích. Nó chỉ ra rằng ít nhất Intel Fortran Compiler và GCC serialise FORALL
báo cáo và xây dựng bên trong OpenMP workshare
chỉ thị bằng cách xung quanh chúng với chỉ thị OpenMP single
trong quá trình biên dịch mà không mang lại tốc độ nào. Các trình biên dịch khác có thể thực hiện nó một cách khác nhau nhưng tốt hơn là tránh sử dụng nó nếu đạt được hiệu suất di động.
Nguồn
2012-07-19 08:52:03
Nếu bạn vẫn còn trên đó - không sử dụng 'FORALL' với' workshare'. Xem có thể cập nhật câu trả lời dưới đây. –