В Torch C ++ API, Как быстро записать внутренние данные тензора? - PullRequest
3 голосов
/ 10 января 2020

Я использую внешний интерфейс torch C ++ и хочу иметь тензор с указанным значением. Чтобы достичь этого, можно выделить память и установить значение вручную, а затем использовать torch::from_blob, чтобы построить тензор на блоке памяти, но он мне кажется недостаточно чистым.

В самом низу В этом документе я обнаружил, что могу использовать индекс для прямого доступа и изменения данных. Однако этот подход имеет большие накладные расходы времени выполнения, вероятно, потому, что доступ с индексом будет рассматривать элемент тензор как тензор 0-d. Следующий код будет стоить более 2 секунд на моем компьютере (-O3 уровень оптимизации), что неоправданно долго для современного процессора.

    torch::Tensor tensor = torch::empty({1000, 1000});
    for(int i=0; i < 1000; i++)
    {
        for(int j=0 ; j < 1000; j++)
        {
            tensor[i][j] = calc_tensor_data(i,j);
        }
    }

Существует ли чистый и быстрый способ достижения этой цели?

1 Ответ

4 голосов
/ 10 января 2020

После нескольких часов бесплодного поиска на Inte rnet у меня возникла гипотеза, и я решил попробовать. Оказывается, средство доступа, упомянутое в том же документе , также работает как левое значение, хотя эта функция вообще не упоминается в документе. Следующий код просто отлично, и это так же быстро, как непосредственно манипулировать необработанным указателем.

    torch::Tensor tensor = torch::empty({1000, 1000});
    auto accessor = tensor.accessor<float,2>();
    for(int i=0; i < 1000; i++)
    {
        for(int j=0 ; j < 1000; j++)
        {
            accessor[i][j] = calc_tensor_data(i,j);
        }
    }
...