Phát hiện thời gian biên dịch kiến ​​trúc CPU


81

Cách đáng tin cậy nhất để tìm ra kiến ​​trúc CPU khi biên dịch mã C hoặc C ++ là gì? Theo như tôi có thể nói, các trình biên dịch khác nhau có tập hợp các định nghĩa tiền xử lý không chuẩn của riêng họ ( _M_X86trong MSVS __i386__, __arm__trong GCC, v.v.).

Có cách tiêu chuẩn nào để phát hiện kiến ​​trúc mà tôi đang xây dựng không? Nếu không, có nguồn nào cho danh sách đầy đủ các định nghĩa như vậy cho các trình biên dịch khác nhau, chẳng hạn như tiêu đề với tất cả các bảng soạn sẵn #ifdefkhông?


1
Về cơ bản, câu trả lời giống nhau để phát hiện hệ điều hành: stackoverflow.com/questions/142508/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Câu trả lời:


78

Dưới đây là một số thông tin về Macro kiến ​​trúc được xác định trước và các loại macro khác được xác định trước.

Câu hỏi này hỏi nơi chúng được định nghĩa trong mã nguồn GCC.


Tiêu chuẩn C hoặc C ++ có xác định bất kỳ macro gợi ý nào sẽ được sử dụng bởi các trình biên dịch khác nhau không.
Krishna Oza

Điều này có vẻ đúng, nhưng ai đó có thể trích dẫn tài liệu GCC nói rằng nó sử dụng nó không?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

15

Không có tiêu chuẩn liên trình biên dịch, nhưng mỗi trình biên dịch có xu hướng khá nhất quán. Bạn có thể xây dựng một tiêu đề cho chính mình giống như sau:

#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif

Không có nhiều điểm cho một danh sách toàn diện, vì có hàng nghìn trình biên dịch nhưng chỉ có 3-4 trình biên dịch được sử dụng rộng rãi (Microsoft C ++, GCC, Intel CC, có thể là TenDRA?). Chỉ cần quyết định trình biên dịch mà ứng dụng của bạn sẽ hỗ trợ, liệt kê các #defines của chúng và cập nhật tiêu đề của bạn nếu cần.


4
Điều này không hoạt động đối với tôi trên Visual Studio 2010. _M_X86không được xác định rõ ràng (bản dựng 32-bit). Câu trả lời đúng là _M_IX86(tín dụng cho liên kết của Serge ở trên).
Thomas

6

Nếu bạn muốn kết xuất tất cả các tính năng có sẵn trên một nền tảng cụ thể, bạn có thể chạy GCC như:

gcc -march=native -dM -E - </dev/null

Nó sẽ đổ macro như #define __SSE3__ 1, #define __AES__ 1vv


-march=nativekhông thành công cho ARM và MIPS cho GCC 4.9 trở xuống.
jww

4

Nếu bạn muốn có một giải pháp xuyên biên dịch sau đó chỉ cần sử dụng Boost.Predef, trong đó có

  • BOOST_ARCH_ cho kiến ​​trúc hệ thống / CPU, người ta đang biên dịch cho.
  • BOOST_COMP_ cho trình biên dịch đang sử dụng.
  • BOOST_LANG_ đối với các tiêu chuẩn ngôn ngữ mà người ta đang biên soạn.
  • BOOST_LIB_C_ và BOOST_LIB_STD_ cho thư viện chuẩn C và C ++ đang được sử dụng.
  • BOOST_OS_ cho hệ điều hành mà chúng tôi đang biên dịch.
  • BOOST_PLAT_ cho các nền tảng trên hệ điều hành hoặc trình biên dịch.
  • BOOST_ENDIAN_ cho sự bền vững của kết hợp hệ điều hành và kiến ​​trúc.
  • BOOST_HW_ cho các tính năng cụ thể của phần cứng.
  • BOOST_HW_SIMD để phát hiện SIMD (Đa dữ liệu hướng dẫn đơn).

Ví dụ

#if defined(BOOST_ARCH_X86)
    #if BOOST_ARCH_X86_64
        std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
    #elif BOOST_ARCH_X86_32
        std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
    #endif
#elif defined(BOOST_ARCH_ARM)
    #if _M_ARM
        std::cout << "ARM " << _M_ARM << " \n";
    #elif _M_ARM64
        std::cout << "ARM64 " << _M_ARM64 << " \n";
    #endif
#endif

Bạn có thể tìm hiểu thêm về cách sử dụng nó tại đây


3

Không có gì tiêu chuẩn. Brian Hook đã ghi lại một loạt những điều này trong "Khai thác nguồn mở di động" của mình, và thậm chí cố gắng biến chúng thành một thứ gì đó mạch lạc và có thể sử dụng được (ymmv về điều đó). Xem tiêu đề posh.h trên trang web này:

Lưu ý, liên kết trên có thể yêu cầu bạn nhập một số userid / mật khẩu không có thật do một cuộc tấn công DOS cách đây một thời gian.


2
Rất tiếc - xin lỗi về liên kết không có thật - nó phải là hookatooka.com/poshlib cung cấp thông tin về userid / password. Trình duyệt của tôi phải có 'tự động đăng nhập' từ một số lần truy cập trang trước đó.
Michael Burr

2
Nó cũng đáng lưu ý ... Các tác giả của trang web đã nêu lý do tại sao họ đã thêm mật khẩu: "Tôi xin lỗi vì sự bất tiện này, nhưng do một cuộc tấn công DDoS không thể giải thích được vào liên kết trực tiếp trước đó của chúng tôi, chúng tôi đã phải tạo trang này để ' đệm 'chống lại DDoS ... " Tôi không chắc việc phạt Michael vì điều đó có công bằng hay không.
jww

-2

Nếu bạn cần phát hiện chi tiết các tính năng của CPU, thì cách tốt nhất là cung cấp chương trình CPUID xuất ra tệp stdout hoặc một số tệp "cpu_config.h" tập hợp các tính năng được CPU hỗ trợ. Sau đó, bạn tích hợp chương trình đó với quy trình xây dựng của bạn.


3
Sẽ không hoạt động để biên dịch chéo. Và làm thế nào để bạn biên dịch một chương trình cpuid trừ khi bạn biết nó cần chạy trên máy nào?
jforberg
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.