0

ビルド時に異なるモジュールを必要とする多数のスーパーコンピューティングクラスターで実行されているリサーチコードを管理する方法を探しています。

例:Server1はインテル®コンパイラーとMKLライブラリーを使用します。Server2は、blasおよびlapackライブラリでgccコンパイラを使用します。

intこれらの違いにより、いくつかのヘッダーファイルが変更され、場所によって交換されますMKL_INT(たとえば)が、最終的にはコードは一般的に同じままであり、(数値ノイズの範囲内で)同じ結果が得られるはずです。

これはアクティブなコードベースであり、私は定期的にビットを変更します。現在、私はgithubにプロジェクトを持っており、Server1からマスターブランチを作成し、次にServer1とServer2という名前の2つの新しいブランチを作成しました。各ブランチのコードを変更して、期待どおりにコンパイルおよび実行し、変更をアップストリームにプッシュしました。

gitに慣れていないので、ここで壁にぶつかりました。このモデルを使用して、コード全般(たとえば、作業ブランチ)で作業し、これらの変更を両方のサーバーブランチにマージできますか?もしそうなら、マスターブランチは本質的に役に立たなくなりますか?この状況で作業するためのより良い方法はありますか?

4

1 に答える 1

4

むしろ、プリプロセッサマクロを使用して、正しいヘッダーファイルとデータ型名が取得されるようにコードをモジュール化することをお勧めします。

gitを使用してこれを行うことはできますが、ワークフローは、達成しようとしていることに対して実際には効率的ではありません。前後にマージして競合を解決するのにかなりの時間を費やすことになります。

  • 2つの独立したタイプの構成があると仮定します(2つ以上に簡単に拡張できるはずです)。オプションを定義し、それらのいずれかに固有のヘッダーを含めるには、次のコード構造を使用できます。

    #if defined(CONFIG_SERVER_1)
    
    /* include any Server1 specific headers */
    /* Define any Server1 specific macros */
    
    #elif defined(CONFIG_SERVER_2)
    
    /* include any Server2 specific headers */
    /* Define any Server2 specific macros */
    
    #else
    
    #error "One of CONFIG_SERVER_1 or CONFIG_SERVER_2 must be defined"
    
    #endif
    
  • あなたはあなたのMakefileからCONFIG_SERVER_1または渡すことができます:CONFIG_SERVER_2

    HOST_NAME := $(shell hostname)
    
    ifeq ($(HOST_NAME),Server1)
    CPPFLAGS += -DCONFIG_SERVER_1=1
    else
    ifeq ($(HOST_NAME),Server2)
    CPPFLAGS += -DCONFIG_SERVER_2=1
    else
    $(error Unsupported host)
    endif
    endif
    
  • 可能な限りコンパイラマクロを活用するようにしてください(将来的にコードを移植可能にします)。たとえば、 MKL_INTfor ICCintforを使用し、GCC他のコンパイラをサポートしない場合は、次のように実行できます。

    #if defined(__INTEL_COMPILER)
    #define MY_INT MKL_INT
    
    #elif defined(__GNUC__)
    #define MY_INT int
    
    #else
    #error "Unsupported compiler!!!"
    
    #endif
    

    またはMY_INTを使用する予定のすべての場所で使用するようにしてください。intMLK_INT

    __PGIPGCC、__llvm__LLVMなどにも同様のマクロがあります。このようなコンパイラ固有のマクロについては、このページを参照してください。ところで、ここにはいくつかの落とし穴があります。たとえば、gcc固有のインクルードにアクセスするために常にICC定義することになります。__GNUC__したがって、上記の使用例では、gccをチェックする前に、他のすべてのコンパイラーをチェックしてください。

  • プロジェクトの残りの部分に含めることができる共通のヘッダーファイルにこのようなマクロを含めると、ソースファイルの数が多い場合に作業が楽になります。

于 2013-03-26T02:51:14.543 に答える