2015-07-21 74 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文件)