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

问题描述 投票:0回答:1

我正在尝试构建然后运行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命令没有很多经验,并且非常感谢有关如何继续的任何建议。

c++
1个回答
2
投票

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

attribute-specifier-seqopt asm(string-literal);

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

[...]没有生成任何有意义的代码。 [...]

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

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

© www.soinside.com 2019 - 2024. All rights reserved.