模型的工程化版C++程序使用CUDA11.3和11.6编译时没任何错误,为适应高版本的jetpack环境,切换到CUDA12编译时总是报错:
/workspace/cuda-12.0/bin/nvcc /workspace/focc/iou3d_nms.cu -c -o ./build/CMakeFiles/bev.dir/src/./bev_generated_iou3d_nms.cu.o -m64 -D__HAVE_NVJPEG__ -Xcompiler ,\"-std=c++14\",\"-O0\",\"-g\",\"-Wno-deprecated-declarations\",\"-DENABLE_TEXT_BACKEND_STB\" -gencode arch=compute_86,code=compute_86 -ccbin /usr/bin/g++ -std=c++14 -O0 -g -Wno-deprecated-declarations -DENABLE_TEXT_BACKEND_STB -DNVCC -I/workspace/cuda-12.0/include -I/workspace/TensorRT-8.6.1.6/include -I/workspace/focc/include -I/usr/include/eigen3
/workspace/cuda-12.0/include/cub/agent/../block/block_merge_sort.cuh(169): error: expected a "," or ">"
1 error detected in the compilation of "/workspace/focc/src/iou3d_nms.cu".
/opt/conda/bin/cmake -E rm -f /workspace/focc/build/CMakeFiles/bev.dir/src/./bev_generated_iou3d_nms.cu.o
CMake Error at bev_generated_iou3d_nms.cu.o.DEBUG.cmake:281 (message):
Error generating file
/workspace/focc/build/CMakeFiles/bev.dir/src/./bev_generated_iou3d_nms.cu.o
感觉这肯定是和cuda版本变化有关cuda12新增的代码里可能有什么不兼容的地方,于是查看报错的cuda-12.0/include/cub/agent/../block/block_merge_sort.cuh发现报错的地方有这样的类模板定义:
template <typename KeyT,
typename ValueT,
int NUM_THREADS,
int ITEMS_PER_THREAD,
typename SynchronizationPolicy>
class BlockMergeSortStrategy
{
static_assert(PowerOfTwo<NUM_THREADS>::VALUE,
"NUM_THREADS must be a power of two");
...
169行是int NUM_THREADS, NUM_THREADS是个int类型的宏值,不可能是空值,怎么可能会导致error: expected a "," or ">" 这样的和语法格式有关的低级错误呢?开始有点束手无策,后来突然想到是不是NUM_THREADS有多个地方定义冲突了,导致编译时替换模板参数为具体的值时对不上而造成语法格式错误,但定义冲突不可能出现在cuda这样的成熟工具软件的内部,那么肯定是在我们自己的程序里了,查查我们自己的代码,果然也有NUM_THREADS的宏定义,把其名字和相关使用的地方都改名,然后再编译错误就消失了。感觉NVIDIA在定义宏时也有点随便了,他们的宏定义起码应该都加上 _NV_ 才是啊,这样避免和应用程序冲突。