2015-07-21 37 views
3

https://github.com/torch/nn/blob/master/generic/Tanh.c這個C代碼(來自lua庫,Torch)如何編譯/工作?

例如,

static int nn_(Tanh_updateOutput)(lua_State *L) 
{ 
    THTensor *input = luaT_checkudata(L, 2, torch_Tensor); 
    THTensor *output = luaT_getfieldcheckudata(L, 1, "output", torch_Tensor); 

    THTensor_(resizeAs)(output, input); 

    if (input->nDimension == 1 || !THTensor_(isContiguous)(input) || !THTensor_(isContiguous)(output)) 
    { 
    TH_TENSOR_APPLY2(real, output, real, input, \ 
    *output_data = tanh(*input_data);); 
    } 
    else 
    { 
    real* ptr_output = THTensor_(data)(output); 
    real* ptr_input = THTensor_(data)(input); 
    long i; 
#pragma omp parallel for private(i) 
for(i = 0; i < THTensor_(nElement)(input); i++) 
    ptr_output[i] = tanh(ptr_input[i]); 
} 
return 1; 
} 

首先,我不知道如何解釋的第一行:

static int nn_(Tanh_updateOutput)(lua_State *L) 

什麼論據嗎? Tanh_updateOutput是指什麼? 「nn_」具有特殊含義嗎?

其次,「TH_TENSOR_APPLY2」和「THTensor _(...)」都被使用,但我沒有看到他們在哪裏定義?這個文件中沒有其他包含?

回答

7

nn_是一個宏。您可以通過搜索存儲庫找到定義"#define nn_";它在init.c

#define nn_(NAME) TH_CONCAT_3(nn_, Real, NAME) 

可以保留的宏定義鏈條之後,你可能會與一些標記粘貼東西,它使nn_(Tanh_updateOutput)擴展到函數的名稱結束。

(這很奇怪的是generic/Tanh.c沒有任何包括; generic/Tanh.c必須由其他一些文件被列入這是不尋常的.c文件)