Как этот код C (из библиотеки lua, Torch) вообще компилируется/работает?

См. 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_(...)", но я не вижу, где они определены? В этом файле нет других включений?


person user678392    schedule 21.07.2015    source источник


Ответы (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 файлов.)

person user2357112 supports Monica    schedule 21.07.2015