Làm cách nào để tạo thư viện tự động chuyển đổi giữa các đường mã SSE, AVX và AVX2 tùy thuộc vào bộ xử lý/hệ điều hành máy chủ? Tôi đang sử dụng VCL của Agner Fog (Thư viện lớp Vector) và biên dịch với GCC cho Linux.Biên dịch mã đa kiến trúc sử dụng Thư viện lớp Vector của Agner
Trả lời
Hướng dẫn lắp ráp cpuid
có thể cung cấp cho bạn thông tin này khi chạy. Ai đó đã tạo một thư viện một cách hữu ích dựa trên điều này để chỉ what you need.
Bạn có thể tạo bảng công văn, và điền nó với các hàm đường dẫn mã chính xác dựa trên kết quả truy vấn bằng cách sử dụng mã này.
UPDATE: (câu trả lời cho câu hỏi trong ý kiến)
Để tạo ra đường dẫn mã khác nhau ở nơi đầu tiên, bạn cần phải biên dịch đường dẫn mã khác nhau riêng biệt, và sau đó liên kết chúng lại với nhau. Đối với mỗi một, bạn chỉ định kiến trúc cần thiết bằng cách sử dụng các giá trị khác nhau của khóa -march
trong dòng biên dịch của bạn.
Vấn đề là tôi không thể (dễ dàng?) tạo ra các đường dẫn mã khác nhau, vì VCL sử dụng nội tại (không phải lắp ráp nội tuyến) mà trình biên dịch chuyển đổi thành bất kỳ tập lệnh nào được chỉ định trong các đối số trình biên dịch. Tôi cho rằng tôi nên đề cập đến việc tôi đang sử dụng GCC. –
Xem câu trả lời cập nhật – Smeeheey
Làm thế nào tôi có thể mangle tên hàm cho mỗi lời gọi trình biên dịch? –
Xem phần "Bộ chỉ thị và gửi CPU" in the manual to the Vector Class Library. Trong phần đó Agner viết
File dispatch_example.cpp cho thấy một ví dụ về làm thế nào để làm cho một CPU phối đó chọn phiên bản mã thích hợp.
Đọc the source code đến distpatch_example.cpp
. Khi bắt đầu tệp, bạn sẽ thấy nhận xét
# Compile dispatch_example.cpp five times for different instruction sets:
| g++ -O3 -msse2 -c dispatch_example.cpp -od2.o
| g++ -O3 -msse4.1 -c dispatch_example.cpp -od5.o
| g++ -O3 -mavx -c dispatch_example.cpp -od7.o
| g++ -O3 -mavx2 -c dispatch_example.cpp -od8.o
| g++ -O3 -mavx512f -c dispatch_example.cpp -od9.o
| g++ -O3 -msse2 -otest instrset_detect.cpp d2.o d5.o d7.o d8.o d9.o
| ./test
Tệp instrset_detect.cpp
. Bạn cũng nên đọc mã nguồn này. Đây là những gì gọi là CPUID.
Here là bản tóm tắt về một số, nhưng không phải tất cả, câu hỏi và câu trả lời của tôi về người điều phối CPU.
'dispatch_example.cpp' gọi' instrset_detect' được khai báo trong 'instrset.h' và được định nghĩa trong' instrset_detect.cpp'. –
xin lỗi, nevermind –
- 1. Kiến trúc nội bộ của trình biên dịch Java
- 2. Biên dịch chương trình C với kiến trúc cụ thể
- 3. Sử dụng py.test với mã thư viện biên soạn
- 4. Biên dịch thư viện tĩnh cho iOS sử dụng OpenMP
- 5. Kiến trúc SIMD và Vector
- 6. Lỗi biên dịch Xcode iOS6: Không có kiến trúc
- 7. Thư viện dex biên dịch
- 8. Sử dụng kiến trúc Android?
- 9. Làm thế nào để hướng dẫn CMake sử dụng trình biên dịch kiến trúc xây dựng?
- 10. Lớp phân lớp từ thư viện được chia sẻ được biên dịch với -fno-rtti
- 11. thư viện biên dịch ZipArchive lỗi
- 12. Trình biên dịch/trình biên dịch BCPL cho hệ điều hành và kiến trúc hiện tại?
- 13. Ưu điểm của việc sử dụng thư viện tĩnh được biên dịch trước bao gồm mã nguồn là gì?
- 14. phân lớp thư viện mã nguồn mở
- 15. Tôi có thể biên dịch mã phổ dụng bằng cách sử dụng GCC của Macports không?
- 16. Làm thế nào để đóng gói một thư viện .NET đa kiến trúc nhắm vào nền tảng Windows phổ thông?
- 17. Cấu trúc phân lớp của kiến trúc sạch Android
- 18. Sử dụng app.config với thư viện lớp
- 19. Kiến trúc CQRS đa người thuê nhà
- 20. Kiến trúc AWS khi đa vùng
- 21. Kiến trúc N-Layer
- 22. Ký hiệu không xác định cho kiến trúc x86_64: Tôi nên sử dụng kiến trúc nào?
- 23. UserControls trong Thư viện Lớp
- 24. Sử dụng các tiêu đề thư viện chuẩn C++ khác nhau với trình biên dịch Intel
- 25. Trình biên dịch không được hỗ trợ 'GCC 4.2' được chọn cho kiến trúc 'i386'
- 26. Biên dịch Thư viện Chia sẻ Động với g ++
- 27. Thư viện được biên dịch JavaScript là gì?
- 28. Dự án Thư viện Lớp tập tin không biên dịch thành .dll hoặc gỡ lỗi
- 29. Biên dịch một thư viện chia sẻ tĩnh
- 30. Java: Làm thế nào tôi có thể biên dịch toàn bộ cấu trúc thư mục của mã?
Nghe giống như giải pháp làm cho tôi. Bạn biết về bộ xử lý/hệ điều hành máy chủ khi bạn xây dựng. Không cần phải làm như vậy trong thời gian chạy. – duffymo
Đối với những người đọc câu hỏi này, nhưng không giới hạn ở VCL và GCC, có một họ cờ biên dịch "-axcode" cho Intel Compilers, có thể tạo ra một số đường dẫn mã nhắm vào nhiều kiến trúc bộ lệnh (ví dụ: đối với SSE , AVX và AVX-512) trong cùng một thư viện/tệp thực thi và để tự động (vô hình) gửi đi giữa chúng trong thời gian chạy. Nhìn vào cuối trang này: https://software.intel.com/en-us/blogs/2016/01/13/compiling-for-the-intel-xeon-phi-processor-x200-and-the- intel-avx-512-isa – zam