我正在尝试构建并运行 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/