我正在尝试构建然后运行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命令没有很多经验,并且非常感谢有关如何继续的任何建议。
导致此问题的原因很简单,上面的代码使用的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代码。最有可能的是,您的构建配置有问题......