2013-03-26 36 views
0

我正在尋找一種方法來管理一些在編譯時需要不同模塊的超級計算集羣上運行的一些研究代碼。使用git來管理不同體系結構的機器的代碼

例如: Server1使用英特爾編譯器和MKL庫。 Server2在blas和lapack庫中使用gcc編譯器。

這些差異會改變一些頭文件,並在MKL_INT的地方替換爲int,但最終代碼通常保持不變,並且應該得到相同的結果(在數值噪聲範圍內)。

這是一個活躍的代碼庫,我經常更換零碎。目前我有github上的項目,從Server1創建了一個主分支,然後是兩個名爲Server1的新分支Server32 & Server2;修改每個分支中的代碼,以便按預期方式進行編譯和運行,並向上遊推送更改。

作爲git的新手,我在這裏遇到了一堵牆。我能夠使用這個模型來處理一般的代碼(比如在一個工作分支上)並將這些改變合併到兩個服務器分支上嗎?如果是這樣,主分支基本上是無用的嗎?有沒有更好的方法去處理這種情況?

+1

我寧願建議使用預處理器宏來模塊化代碼,以便正確的頭文件和數據類型名稱被拾取。配置文件或環境變量可以與Makefile一起使用,並可以指示它是哪種環境。雖然你可以使用git來實現這個功能,但是工作流程對於你想要實現的功能並不是很有效。你會花費大量的時間來回合併解決衝突。 – Tuxdude 2013-03-26 02:12:18

+0

這是一個非常好的主意,我沒有考慮過。如果你稍微擴展一下,我會接受它 - 謝謝。 – Geodesic 2013-03-26 02:22:49

回答

4

我寧願建議使用預處理器宏模塊化您的代碼,以便正確的頭文件和數據類型名稱被拾取。

雖然你可以使用git來做到這一點,但工作流程對於你想要達到的效果並不是很有效。你會花費大量的時間來回合併解決衝突。

  • 讓我們假設您有兩種獨立的配置類型(您應該很容易擴展到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 
    
  • 你可以通過CONFIG_SERVER_1CONFIG_SERVER_2從你的Makefile:

    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_INTICCintGCC和不支持任何其他的編譯器,你可以這樣做:

    #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

    還有類似的宏,用於PGCC的__PGI,用於LLVM的__llvm__等。查看this頁面以獲得更多此類編譯器特定的宏。順便說一句,這裏有一些陷阱喜歡ICC結束定義__GNUC__總是可以訪問一些gcc特定包含。所以對於上面的用例,確保在檢查gcc之前檢查所有其他編譯器。

  • 包括可以通過項目的其餘部分包括將讓您的生活更輕鬆,當你有多個源文件的數量共同頭文件這樣的宏。

+0

完美!再次感謝。 – Geodesic 2013-03-26 03:04:15

相關問題