当行已经平衡时,为什么asm期望()

时间:2019-04-29 19:02:24

标签: 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)));
    }

错误显示:预期为“)”

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

我对asm命令没有太多的经验,希望对如何进行操作有任何建议。

1 个答案:

答案 0 :(得分:2)

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

attribute-specifier-seq opt asm string-literal );

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

  

[…]不会生成任何有意义的代码。 […]

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

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