【问题标题】:Pytorch Tensor::data_ptr<long long>() not working on LinuxPytorch Tensor::data_ptr<long long>() 在 Linux 上不起作用
【发布时间】:2021-05-18 10:57:51
【问题描述】:

Linux下无法链接我的程序到pytorch,出现如下错误:

/tmp/ccbgkLx2.o: In function `long long* at::Tensor::data<long long>() const':
test.cpp:(.text._ZNK2at6Tensor4dataIxEEPT_v[_ZNK2at6Tensor4dataIxEEPT_v]+0x14): undefined reference to `long long* at::Tensor::data_ptr<long long>() const'

我正在构建一个非常简单的最小示例:

#include "torch/script.h"
#include <iostream>

int main() {
    auto options = torch::TensorOptions().dtype(torch::kInt64);
    torch::NoGradGuard no_grad;
    auto T = torch::zeros(20, options).view({ 10, 2 });
    long long *data = (long long *)T.data<long long>();
    data[0] = 1;
    return 0;
}

用于构建它的命令:

g++ -w -std=c++17 -o test-torch test.cpp -D_GLIBCXX_USE_CXX11_ABI=1 -Wl,--whole-archive -ldl -lpthread -Wl,--no-whole-archive -I../libtorch/include -L../libtorch/lib -ltorch -ltorch_cpu -lc10 -Wl,-rpath,../libtorch/lib

Pytorch 已从链接 https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.7.0%2Bcpu.zip 下载并解压缩(所以我在 test.cpp 文件夹旁边有 libtorch 文件夹)。

任何想法如何解决这个问题?同样的程序在 Visual C++ 下也能正常运行。

附:我知道 pytorch 是为 cmake 设计的,但我对 cmake 的经验为零,也不想为我的应用程序编写基于 cmake 的构建系统。此外,他们提供的示例似乎只在系统中“安装”了 pytorch 时才有效。所以我不能只下载带有库的 .zip 吗?如果我在 AVX512 系统上“安装”它(例如从源代码或以任何其他方式),我链接到它并分发给最终用户的二进制文件是否可以在非 AVX512 上工作?文档对于新手来说是完全无法理解的。

更新:我尝试按照教程https://pytorch.org/cppdocs/installing.html 通过 CMake 执行此操作,并得到完全相同的错误。具体来说,我将我的目录重命名为 example-app,并将源文件重命名为 example-app.cpp。然后我在这个目录中创建了 CMakeLists.txt,内容如下:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)

find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

然后

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=../../libtorch ..
cmake --build . --config Release

这是输出:

CMakeFiles/example-app.dir/example-app.cpp.o: In function `long long* at::Tensor::data<long long>() const':
example-app.cpp:(.text._ZNK2at6Tensor4dataIxEEPT_v[_ZNK2at6Tensor4dataIxEEPT_v]+0x14): undefined reference to `long long* at::Tensor::data_ptr<long long>() const'

让我想,也许我忘了包含一些标题或定义一些变量? 哦,这都是在 Mint 19.2(相当于 Ubuntu 18.04)上,g++ 版本是 7.5.0,glibc 是 2.27。用 g++-8 编译得到同样的结果。

【问题讨论】:

    标签: pytorch linker-errors libtorch


    【解决方案1】:

    这不是与 cmake 相关的错误,它只是库的实现方式。我不知道为什么,但似乎 T* at::Tensor::data&lt;T&gt; constT = long long 的专业化被遗忘/省略了。

    如果您想获得签名的 64 位指针,您仍然可以通过 int64_t 获得它:

    auto data = T.data<int64_t>();
    

    最好使用通常明确大小的这些类型,以避免兼容性问题。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多