pytorch源碼閱讀學習筆記(C代碼宏展開實現泛型)

基本原則:#include的文件就相當於粘貼了一份代碼;”.h”文件裏放數據結構struct定義、函數聲明(全局可以被多次#include);”.cpp”文件裏放函數定義(實現代碼;全局只能被編譯一次);

 

  • TH/generic/THTensor.h: 數據結構定義和函數聲明;使用以下開關來控制要定義宏指向自己,還是展開代碼:

#ifndef TH_GENERIC_FILE

#define TH_GENERIC_FILE "TH/generic/THTensor.h"

#else

  • TH/generic/THTensor.cpp: 函數定義(代碼實現);還是用那個開關來控制,同時起到了自己不單獨編譯的作用(只被TH/THTensor.cpp進行#include,避免再次編譯造車報錯)
  • TH/THTensor.h:

#define THTensor_(NAME)   TH_CONCAT_4(TH,Real,Tensor_,NAME)

#include <TH/generic/THTensor.h>     // 圖的是該文件首部的#define TH_GENERIC_FILE "TH/generic/THTensor.h", 只定義上這個宏,不包含其裏面的代碼;

#include <TH/THGenerateAllTypes.h>   // 該文件裏先定義scalar_t和Real等宏對應實際值,再#include <TH/generic/THTensor.h>把代碼放進來,再#undef scalar_t和Real等宏和TH_GENERIC_FILE宏;

#include <TH/generic/THTensor.h>     // 每種數據類型寫兩行這個

#include <TH/THGenerateHalfType.h>  // 這裏變了

  • TH/THTensor.cpp:先#include “TH/THTensor.h”,把所有類型聲明放進來;再用兩行一組法對每種數據類型進行代碼生成(他每次#include的是<TH/generic/THTensor.cpp>);

 

THGeneral.h這個文件找不到,應該是由THGeneral.h.in這個文件生成的(在CMakeLists.txt裏用configure_file來copy了一份);其中定義了TH_CONCAT_4等宏;

 

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章