这个 C 代码(来自 lua 库,Torch)是如何编译/工作的?

Posted

技术标签:

【中文标题】这个 C 代码(来自 lua 库,Torch)是如何编译/工作的?【英文标题】:How does this C code (from lua library, Torch) even compile/work? 【发布时间】:2015-10-10 09:27:24 【问题描述】:

见https://github.com/torch/nn/blob/master/generic/Tanh.c

例如,

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

【问题讨论】:

【参考方案1】:

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

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

您可以继续遵循宏定义链,您最终可能会得到一些标记粘贴,使nn_(Tanh_updateOutput) 扩展为函数的名称。

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

【讨论】:

以上是关于这个 C 代码(来自 lua 库,Torch)是如何编译/工作的?的主要内容,如果未能解决你的问题,请参考以下文章

错误:在编译时找不到 Lapack 库(zerobrane、lua、torch)

几种深度学习框架的简单介绍

如何将 Lua FFI 与 C++ 函数一起使用

lua/torch (OS X) 的 Gnu 绘图错误

给用torch的童鞋,lua代码规范

为 Lua 包装 C 库:如何创建嵌套的函数表?