这个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_(...)” 都被使用了,但我看不到它们的定义在哪里?这个文件中没有其他的 includes?

点赞
用户2357112
用户2357112

nn_是一个宏。您可以通过在存储库中搜索“ #define nn_”找到定义;它在init.c中:

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

您可以继续跟随宏定义链,最终可能会得到一些标记拼接的东西,使nn_(Tanh_updateOutput)扩展成函数的名称。

(奇怪的是generic/Tanh.c没有任何包括; generic/Tanh.c必须由某个其他文件包括。这对于.c文件来说是不寻常的。)

2015-07-21 04:29:19