我正在尝试为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命令没有太多的经验,希望对如何进行操作有任何建议。
答案 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代码。您的构建配置最有可能出问题了……