Làm thế nào để tôi biết nếu mã của tôi đang được trình biên dịch vector hóa?


9

Như được minh họa bằng câu trả lời của Jed Brown về Chi phí tra cứu so với tính toán , sử dụng các phép toán dấu phẩy động được vectơ so với không được vector hóa dẫn đến mã nhanh hơn nhiều. Nhiều trình biên dịch hiện đại tuyên bố rằng họ có thể thực hiện vector hóa tự động. Làm thế nào để tôi phần nào trong mã của tôi đang được vector hóa thành công?

Câu trả lời:


10

Với trình biên dịch Intel của bất kỳ cổ điển hiện đại nào , -O3 -vec-report3. Tối ưu hóa cấp ba đảm bảo rằng nó đang cố gắng vector hóa và báo cáo vectơ sẽ cho bạn biết những gì nó đang làm.

Trang GNU về vector hóa nói rằng nó được bật theo mặc định ở mức tối ưu hóa 3, nhưng tôi không thể tìm thấy tương đương với báo cáo vec.


Cảm ơn đã phản ứng nhanh chóng. Tôi không biết về -vec-báo cáo3. Bạn có một sở thích biên dịch khi nói đến loại điều này (vector hóa tự động)?
Matthew Emmett

Trình biên dịch Intel thực sự tốt, nhưng chỉ dành cho chip intel. Bạn chỉ cần thêm tất cả các pragma đúng (#pragma ivdep là dễ nhất) GCC 4.7 đã tốt hơn rất nhiều nhưng nhìn qua một số mã với một đồng nghiệp thì nó vẫn có lỗi (như không có vector hóa trong các pragma openmp).
aterrel

1
Tôi sẽ khuyên bạn nên kiểm tra lại cách trình biên dịch Intel thực hiện với vector hóa trên chip AMD. Tôi không chắc chắn 100% rằng các vấn đề cũ vẫn còn tồn tại.
Bill Barth

2
@BillBarth Vâng, vẫn còn một vấn đề. Xem Thông báo tối ưu hóa (ở nhiều nơi, ví dụ: software.intel.com/sites/products/collonymous/hpc/compilers/, ). AMD đã thắng trong cuộc chiến tòa án yêu cầu Intel tiết lộ rằng họ chống cạnh tranh, không khiến họ ngừng tồn tại. vi.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog trên cách giải quyết: agner.org/optizes/blog/read.php?i=49
Jed Brown

@JedBrown, chắc chắn SSE vẫn còn lạ, nhưng câu chuyện với AVX là gì? Các liên kết này chỉ ra rằng mọi thứ sẽ ổn (vì cả hai công ty đều triển khai AVX), nhưng tôi chưa thử nghiệm nó trên máy Bulldozer.
Bill Barth

8

Trong bộ sưu tập trình biên dịch GNU, bạn có tùy chọn -ftree-vectorizer-verbose=ntrong đó nmột số từ 0 đến 6 sẽ in thông tin tương tự icc/ ifort.


5

Với trình biên dịch GNU, việc thêm -Wa,-ahl=asm.ssẽ kết xuất mã lắp ráp được tạo ra asm.s.

Với trình biên dịch Intel, việc thêm -fcode-asm -Faasm.ssẽ kết xuất mã được tạo ra asm.s.

Sau đó, bạn có thể kiểm tra mã lắp ráp và tìm kiếm các hoạt động điểm nổi vector.


Tôi hoàn toàn đồng ý rằng kiểm tra đầu ra lắp ráp là cách đáng tin cậy duy nhất để xác định xem mã có thực sự được vector hóa hay không. Không có gì đòi hỏi trình biên dịch phải trung thực về các yêu cầu của họ để vector hóa mã.
Jeff
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.