2016-06-07 15 views
5

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

+0

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

+0

Đố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

Trả lời

3

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.

+0

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. –

+0

Xem câu trả lời cập nhật – Smeeheey

+0

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? –

3

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.

+0

'dispatch_example.cpp' gọi' instrset_detect' được khai báo trong 'instrset.h' và được định nghĩa trong' instrset_detect.cpp'. –

+0

xin lỗi, nevermind –

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