MatX编译问题:共享变量初始化报错求助
问题描述
在Ubuntu 20.04环境下,按照MatX官方文档步骤编译安装,执行make -j时触发如下编译错误:
/home/<me>/Documents/MatX/include/matx/kernels/channelize_poly.cuh(349): error: initializer not allowed for __shared__ variable /home/<me>/Documents/MatX/include/matx/kernels/channelize_poly.cuh(349): error: initializer not allowed for __shared__ variable /home/<me>/Documents/MatX/include/matx/kernels/channelize_poly.cuh(349): error: initializer not allowed for __shared__ variable /home/<me>/Documents/MatX/include/matx/kernels/channelize_poly.cuh(349): error: initializer not allowed for __shared__ variable /home/<me>/Documents/MatX/include/matx/kernels/channelize_poly.cuh(349): error: initializer not allowed for __shared__ variable /home/<me>/Documents/MatX/include/matx/kernels/channelize_poly.cuh(64): error: initializer not allowed for __shared__ variable
查看报错代码行,发现并未对__shared__变量做显式初始化:
// Lines 63 & 64 const int SMEM_MAX_FILTER_TAPS = 128; __shared__ filter_t smem_filter[SMEM_MAX_FILTER_TAPS]; // Lines 348 & 349 // Pre-compute the DFT complex exponentials and store in shared memory __shared__ output_t smem_eij[NUM_CHAN][NUM_CHAN];
环境配置:
- CUDA 11.6
- G++ 9.4.0
- Ubuntu 20.04
解决方案
1. 升级CUDA版本
CUDA 11.6对编译期常量作为共享内存数组大小的语法支持存在限制,而MatX最新代码可能依赖更高版本CUDA的特性。建议将CUDA升级至11.7及以上版本(优先推荐12.x系列),升级后重新执行编译流程。
2. 调整CMake编译参数
检查CMake配置是否启用了正确的CUDA架构和C++标准:
- 重新运行CMake时添加参数,指定匹配你GPU的架构(如75对应Turing架构,80对应Ampere架构),并开启C++17标准:
cmake .. -DCMAKE_CUDA_ARCHITECTURES=你的GPU架构编号 -DCMAKE_CXX_STANDARD=17 - 执行上述命令后,重新运行
make -j编译。
3. 临时代码修改(不推荐)
若暂时无法升级CUDA,可尝试手动修改报错代码,将共享内存数组的大小替换为直接数值常量:
- 将第64行改为:
__shared__ filter_t smem_filter[128]; - 第349行将
NUM_CHAN替换为其实际定义的数值(需查看代码中该宏的具体值)
注意:此方法可能破坏代码的通用性,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Hugo Phibbs
相关产品推荐
相关产品推荐

