无法让 CUDA 在 Tango 上运行,或者:我如何为另一个 ARM EABI 修改代码?

Can't get CUDA working on Tango, or: how do I mangle code for another ARM EABI?

首先,对于可能具有误导性的标题,我深表歉意,但我想不出更好的简短描述。

为了完成我的学士论文,我编写了一个出于性能原因需要 CUDA 的 Tango 应用程序。不幸的是,我不是经验丰富的 Android 开发人员,因此所有关于 CUDA、JNI 或 Tango 的教程和指南中有 90% 都不够基础。

据我所知,NVCC 总是为 armeabi-v7a-hard ABI 生成代码。因此,据我了解,我的 "normal" C++ 代码也必须为此 ABI 进行编译。虽然那时我无法调试我的 C++ 代码,但我可以接受它,并且在经过许多小时的阅读和反复试验后它也能正常工作。

然而,今天我 运行 进入这个问题:。 libtango_client_api.so 没有为 armeabi-v7a-hard 编译。我不明白为什么我的链接过程没有失败,但事实就是如此。

从我的角度来看,我现在有几个选择:

  1. 编译armeabi-v7a的整个项目。我相信这将是最好的解决方案,但需要 NVCC 提供匹配代码。似乎有可能将 -mfloat-abi=hard-switch 传递给 g++,但我找不到任何关于它的作用和原因以及它是否有效的文档。

  2. 在提到的Whosebug-article中他们提到了"mangling"tango_client_api.h。我发现了两个提示:1 and 2, section 3.10, p. 12,所以我尝试更改 header 中的每个函数声明(例如)

    void TangoConfig_free(TangoConfig config)
    

    void TangoConfig_free(TangoConfig config) __attribute__((pcs("aapcs-vpf"))) ;
    

    __hardfp void TangoConfig_free(TangoConfig config);
    

    前者在 Error:error: 'pcs' attribute ignored [-Werror=attributes] 下崩溃,后者根本无法编译 (Error:error: '__hardfp' does not name a type)。所以,要么我做错了什么,要么这是一个被 g++ 忽略并且只被 armcc 尊重的属性。

  3. 重新编译libtango_client_api.so。不过,我在 Google 的网站上找不到任何源代码。

  4. 不使用TangoService_getPoseAtTime-功能。这不是什么大问题,但我担心我可能会发现其他损坏的功能或出现奇怪的行为,因为它显然只是意外工作。

  5. 使用 Java CUDA 包装器。无法想象这是个好主意,但是...

非常感谢任何帮助!

为什么您认为 nvcc 只生成 armeabi-v7a-hard 代码?您可以将 CUDA 代码编译为常规的 armeabi-v7a 二进制文件。

据我所知,nvcc 取决于您编译代码时使用的工具链(使用 -ccbin 参数),并且 armeabi-v7a 受标志 -march=armv7-a -mfloat-abi=softfp.[=12 支持=]