CPUアーキテクチャのコンパイル時の検出
-
02-07-2019 - |
質問
CまたはC ++コードをコンパイルするときにCPUアーキテクチャを見つける最も信頼できる方法は何ですか?私が知る限り、異なるコンパイラは独自の非標準プリプロセッサ定義のセットを持っています(MSVSの _M_X86
、GCCの __ i386 __
、 __ arm __
など)。
構築しようとしているアーキテクチャを検出するための標準の方法はありますか?そうでない場合、すべての定型的な #ifdef
sを含むヘッダーなど、さまざまなコンパイラーの定義の包括的なリストのソースはありますか?
解決
事前定義アーキテクチャマクロおよびその他の種類のpre定義マクロ。
この質問定義されている場所を尋ねる GCCソースコード内。
他のヒント
コンパイラー間標準はありませんが、各コンパイラーはかなり一貫している傾向があります。次のようなヘッダーを自分で作成できます。
#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif
#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif
何千ものコンパイラーがありますが、広範囲に使用されているのは3〜4のみであるため(Microsoft C ++、GCC、Intel CC、TenDRAなど)、包括的なリストにはあまり意味がありません。アプリケーションがサポートするコンパイラを決定し、それらの#definesをリストし、必要に応じてヘッダーを更新するだけです。
特定のプラットフォームで利用可能なすべての機能をダンプする場合は、次のようにGCCを実行できます。
gcc -march=native -dM -E - </dev/null
#define __SSE3__ 1
、 #define __AES__ 1
などのマクロをダンプします。
クロスコンパイラソリューションが必要な場合は、を使用します。 Boost.Predef
には以下が含まれています
-
コンパイル対象のシステム/ CPUアーキテクチャ用の
-
BOOST_ARCH _
。
使用しているコンパイラの -
BOOST_COMP _
。
コンパイル対象の言語標準の -
BOOST_LANG _
。
使用中のCおよびC ++標準ライブラリの -
BOOST_LIB_C _
およびBOOST_LIB_STD _。
コンパイルするオペレーティングシステムの -
BOOST_OS _
。 -
BOOST_PLAT _
は、オペレーティングシステムまたはコンパイラ上のプラットフォーム用です。
OSとアーキテクチャの組み合わせのエンディアンのための -
BOOST_ENDIAN _
。
ハードウェア固有の機能については、 -
BOOST_HW _
。
SIMD(単一命令複数データ)検出用の -
BOOST_HW_SIMD
。
たとえば
#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
使用方法の詳細については、こちら
標準はありません。 Brian Hookはこれらの束を「Portable Open Source Harness」で文書化し、一貫性のある使いやすいものにしようとしています(それに関するymmv)。このサイトのposh.hヘッダーを参照してください。
上記のリンクでは、しばらく前のDOS攻撃のために、偽のユーザーID /パスワードを入力する必要がある場合があります。
CPU機能のきめ細かい検出が必要な場合、最善の方法は、stdoutまたは一部の「cpu_config.h」に出力するCPUIDプログラムも同梱することです。 CPUがサポートする機能のセットを提出します。次に、そのプログラムをビルドプロセスに統合します。