3

C++ プログラムを中間コードにコンパイルしたいと考えています。次に、現在のプロセッサのすべてのリソースを使用して中間コードをコンパイルします。

最初のステップは、最適化 (-O2) を使用して C++ プログラムをコンパイルし、リンカを実行して、ほとんどのコンパイル手順を実行することです。この手順は、オペレーティング システムやアーキテクチャに依存しない必要があります。

2 番目のステップでは、最初のステップの結果を、元のソース コードを使用せずに、現在のコンピューターのオペレーティング システムとプロセッサ用に、プロセッサの最適化と特別な命令 (-march=native) を使用してコンパイルします。2 番目のステップは高速で、最小限のソフトウェア要件で行う必要があります。

私はそれを行うことができますか?どうやってするの?

編集
各プラットフォームとオペレーティングシステムのコンパイルを配布するのではなく、元のソースコードなしで、プロセッサのすべてのリソースを使用できるプラットフォームに依存しないプログラムを配布したいので、やりたいです。2 番目のステップが迅速かつ簡単であればよいでしょう。

同じアーキテクチャのプロセッサでも、機能が異なる場合があります。X86 プロセッサには SSE1、SSE2 などがありますが、それらは 32 ビットまたは 64 ビットです。一般的な X86 用にコンパイルすると、SSE の最適化が不足します。何年も経つと、プロセッサに新しい機能が追加され、新しいプロセッサ用にプログラムをコンパイルする必要があります。

4

3 に答える 3

7

ただの提案-googleclangとLLVM。

于 2011-05-09T21:14:01.770 に答える
3

コンパイラについてどれくらい知っていますか? 「-O2」を魔法のフラグとして扱っているようです。

たとえば、レジ​​スタの割り当ては典型的な最適化です。利用可能なレジスタの数を確認する必要があります。レジスタ 16に割り当てfooても意味がなく、フェーズ 2 で x86 をターゲットにしていることがわかります。

また、これらのアーキテクチャに依存する最適化は非常に複雑になる可能性があります。インライン化は呼び出しコストに大きく依存し、それはアーキテクチャに依存します。

于 2011-05-10T08:58:32.553 に答える
0

「プロセッサ固有の」最適化に到達すると、事態は非常に複雑になります。プラットフォーム固有のコンパイラが、適切な「レベル」でのオブジェクトまたは「中間」コードの生成において真に「ジェネリック」であることは非常に困難です。「IL」(中間言語) コード (C#-IL など) のようなものでない限り、コード、または Java バイトコード) の場合、特定のコンパイラが「どこで停止するか」を知るのは非常に困難です (ターゲット プラットフォームの知識が存在する場合、コンパイルのさまざまなレベルであらゆる場所で最適化が行われるため)。

*.i別の考え: 通常は " " 拡張子を持つ "前処理された" ソース コードにコンパイルしてから、さまざまなアーキテクチャで分散方式でコンパイルするのはどうでしょうか。

たとえば、ほとんどの (すべての) C および C++ コンパイラは、次のようなものをサポートしています。

cc /P MyFile.cpp
gcc -E MyFile.cpp

...eachMyFile.iは、前処理されたファイルである を生成します。ファイルにすべて#definesのヘッダーとその他の*.i. (プリプロセッサ マクロがターゲット プラットフォームに固有のものである場合は、賢くする必要があるかもしれませんが、この前処理を行うためのコマンド ラインを生成する必要があるビルド システムでは非常に簡単である必要があります。)

これは、ファイルをローカルで前処理するためにdistccが使用するアプローチであるため、リモートの「ビルド ファーム」にはヘッダーやその他のパッケージをインストールする必要はありません。(ビルド ファーム内のマシンがどのように構成されていても、同じビルド プロダクトを取得することが保証されます。)

したがって、同様に、単一のマシンの「構成/前処理」を集中化する効果がありますが、クロスコンパイル、プラットフォーム固有のコンパイル、またはビルドファームのサポートを分散方式で提供します。

参考までに -- このコンセプトはとても気に入ってdistccいますが、その特定のプロジェクトの最終更新は 2008 年でした。そのため、他の同様のツールや製品が見つかったら興味があります。(当面の間、同様のツールを作成しています。)

于 2011-05-10T22:41:56.560 に答える