c++ - 为什么当线路已经平衡时 asm 期望 ()

标签 c++

我正在尝试构建并运行 kinfu_remake 的演示 https://github.com/Nerei/kinfu_remake

运行 windows 10,cmake3.14.3,MS visual studio 2017

我在构建这些特定行时遇到错误(device.hpp 第 132 行):

    template<> __kf_device__ void kfusion::device::gmem::StCs(const TsdfVolume::elem_type& val, TsdfVolume::elem_type*& ptr)
    {
        short cx = val.x, cy = val.y;
        asm("st.global.cs.v2.u16 [%0], {%1, %2};" : "="_ASM_PTR_(ptr) : "h"(reinterpret_cast<ushort&>(cx)), "h"(reinterpret_cast<ushort&>(cy)));
    }

错误读取:应为“)”

() 似乎是平衡的,所以我不确定是什么导致了这个问题。我环顾四周,看到有些人在使用需要 ()s 的 if 语句时遇到错误,但出于几个原因,我认为这不是这里的问题。 1) 我把 () 放在任何可能需要它的地方,并且 2) 注释掉这一行后,成功构建的代码让我相信错误出在这一行。 (显然注释掉不是解决方案,因为我需要该行才能成功执行)

我对 asm 命令没有太多经验,如果有任何关于如何继续的建议,我将不胜感激。

最佳答案

导致此问题的原因很简单,您上面的代码使用的 GCC asm 语法是非标准的,因此 Visual C++ 无法理解。 asm 声明的“官方”语法是 [dcl.asm] :

属性说明符序列opt asm ( string-literal ) ;

除此之外,asm 声明仅为 conditionally supported [dcl.asm]/1 ,这意味着标准没有要求编译器必须支持 asm 声明。如果编译器确实支持 asm 声明,则其含义由实现定义。 documented behavior Visual C++ 上的 asm 声明是编译器会默默地吃掉它,但是

[…] not generate any meaningful code. […]

Visual C++ 有自己的非标准 __asm keyword ,但语法完全不同,内联汇编 is actually only supported when targeting 32-Bit x86 ……

除此之外,上面代码中的程序集似乎是 PTX assembly ,这表明您正在尝试使用 Visual C++ 编译 CUDA GPU 代码。这显然是行不通的。您需要使用支持 CUDA 的编译器来编译您的 CUDA 代码。很可能是您的构建配置有问题……

关于c++ - 为什么当线路已经平衡时 asm 期望 (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909347/

相关文章:

c++ - 如何设置 Visual C++ 2010 Express 在构建过程中复制一些文件夹?

c++ - 为了 jsoncpp (c++) 编写

c++ - 在 C++ 中的不同函数中传递用户输入字符串

python - 如何使用 Boost Python 将 Python 派生类升级到它的 c++ 基类?

c++ - 带异常的 C/C++ 标准库包装器

c++ - 在当前 2d 游戏架构中实现游戏逻辑层的方法

c++ - 改变一个指针后乘法对象改变

c++ - boost 路径包含 Mingw 的困境

c++ - QT套接字读取丢失字节

c++ - 使用 superres 从多个图像创建超分辨率图像