这个 C 代码(来自 lua 库,Torch)如何甚至 compile/work?
How does this C code (from lua library, Torch) even compile/work?
见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_(...)"都用了,但是没看到是在哪里定义的?这个文件中没有其他包含?
nn_
是一个宏。您可以通过在存储库中搜索 "#define nn_"
来找到定义;它在 init.c
:
#define nn_(NAME) TH_CONCAT_3(nn_, Real, NAME)
您可以继续跟踪宏定义链,您最终可能会得到一些使 nn_(Tanh_updateOutput)
扩展为函数名称的标记粘贴内容。
(奇怪的是 generic/Tanh.c
没有任何包含;generic/Tanh.c
必须被其他文件包含。这对于 .c
文件来说是不寻常的。)
见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_(...)"都用了,但是没看到是在哪里定义的?这个文件中没有其他包含?
nn_
是一个宏。您可以通过在存储库中搜索 "#define nn_"
来找到定义;它在 init.c
:
#define nn_(NAME) TH_CONCAT_3(nn_, Real, NAME)
您可以继续跟踪宏定义链,您最终可能会得到一些使 nn_(Tanh_updateOutput)
扩展为函数名称的标记粘贴内容。
(奇怪的是 generic/Tanh.c
没有任何包含;generic/Tanh.c
必须被其他文件包含。这对于 .c
文件来说是不寻常的。)