Ada编译报错“Cannot use function in a procedure call”的纠错方法

本文探讨了Ada编程语言中cannot use function in a procedure call错误的原因及解决方案。通过实例说明如何正确处理函数调用的返回值,避免编译错误。

在调试一个Ada程序时编译器报以下错误:

cannot use function "***" in a procedure call

我望文生义地以为是提示“不能在一个过程调用中调用函数”***“。但是当前的调用者是一个task啊。

从Stack Overflow搜到同样问题(https://stackoverflow.com/questions/14719935/cannot-use-function-in-a-procedure-call-compiler-error)。原因是Ada语言不允许象C语言那样忽略函数调用的返回值。

Stack Overflow的另一个帖子(https://stackoverflow.com/questions/9206769/ignore-ada-function-return-values)提供了Ada忽略函数调用返回值的方法,如下例所示:

declare
   dummy : constant return_type := my_function;
   pragma Unreferenced (dummy);
begin null; end;
<think>我们正在处理一个关于在40系列显卡上编译DCNv2时出现错误的问题。根据常见的经验,这通常是由于CUDA架构兼容性问题导致的。40系列显卡(如RTX 4090)使用Ada Lovelace架构,对应的CUDA架构版本是sm_89和sm_90。而较旧的DCNv2代码可能没有包含对新架构的支持。 解决方案通常是在编译时指定正确的CUDA架构版本。我们可以通过修改编译命令或源码中的编译选项来实现。 步骤: 1. 找到编译DCNv2时设置CUDA架构的代码位置(通常是在setup.py文件中)。 2. 添加对sm_89和sm_90的支持。 例如,在setup.py中,可能会有一个类似这样的列表: arch_flags = ['-gencode', 'arch=compute_60,code=sm_60', '-gencode', 'arch=compute_61,code=sm_61', ...] 我们需要添加对新架构的支持,如: '-gencode', 'arch=compute_89,code=sm_89', '-gencode', 'arch=compute_90,code=sm_90', 或者,我们可以通过环境变量来指定架构,例如: TORCH_CUDA_ARCH_LIST="8.9;9.0" python setup.py build develop 但是,具体步骤可能因项目而异。 另外,如果使用的是PyTorch 1.10或更高版本,可能还需要注意其他兼容性问题。 由于用户没有提供具体的错误信息,我们只能给出一般性的建议。 如果用户遇到了类似以下错误: nvcc fatal : Unsupported gpu architecture 'compute_86' 那么这明确表示需要添加对新架构的支持。 参考做法:在DCNv2的GitHub仓库中,已经有人提出了类似的问题,并且提供了修改setup.py的解决方案。我们可以参考这些PR或issue。 例如,一个常见的修改是: 在setup.py中,将arch_flags扩展,加入新的架构。 但是,请注意,不同的分支可能有不同的设置。例如,在mmdetection中的DCNv2,或者原始仓库中的DCNv2,位置可能不同。 因此,我们建议用户检查自己的setup.py文件,并添加对应的架构。 具体步骤: 1. 打开DCNv2的setup.py文件。 2. 查找包含'arch=compute'的行,或者一个名为`arch_flags`的列表。 3. 在列表中添加: '-gencode', 'arch=compute_89,code=sm_89', '-gencode', 'arch=compute_90,code=sm_90', 4. 保存并重新编译。 如果setup.py中没有显式指定arch_flags,那么可能是通过其他方式指定。此时,我们可以尝试通过环境变量指定: export TORCH_CUDA_ARCH_LIST="7.5;8.0;8.6;8.9;9.0" python setup.py build develop 注意:这里我们添加了多个架构,包括用户显卡所需的8.9和9.0,同时也保留了之前的架构以保证兼容性。 如果上述方法仍然不行,可能需要更新CUDA工具包和PyTorch版本,确保它们支持Ada Lovelace架构。 另外,还有一些用户报告需要将CUDA代码中的`__shfl`函数改为`__shfl_sync`以避免编译错误(因为CUDA 10以后引入了同步要求),但这通常出现在较旧的代码中。如果用户遇到类似错误,可以尝试修改源码。 例如,在DCNv2的.cu文件中,将: __shfl(... 改为: __shfl_sync(0xffffffff, ... 但是,由于我们没有具体的错误信息,所以先提供架构的解决方案。 由于用户使用的是40系列显卡,我们假设其驱动和CUDA工具包已经更新到较新的版本(至少CUDA 11.8以上)。 总结: 1. 修改setup.py,添加sm_89和sm_90架构。 2. 通过环境变量指定架构并重新编译。 3. 如果遇到其他编译错误,可能需要根据错误信息进一步修改源码。 如果用户按照上述步骤操作后仍然无法解决,请提供具体的错误信息以便进一步排查。 相关问题: 1. 如何查看当前显卡的CUDA架构版本? 2. 如何更新CUDA工具包和PyTorch版本? 3. 在编译DCNv2时遇到`__shfl`相关错误应该如何处理?</think>### DCNv2在40系列显卡编译错误解决方案 在40系列显卡(如RTX 4090)上编译DCNv2时出现错误,通常是由于CUDA架构不兼容导致的。40系列显卡采用Ada Lovelace架构(CUDA sm_89/sm_90),而旧版DCNv2可能未包含这些新架构的支持。以下是完整解决方案: #### 1. **修改编译配置(关键步骤)** 在`setup.py`中添加40系列显卡的CUDA架构支持: ```python # 在setup.py中找到类似段落,添加sm_89和sm_90 extra_compile_args = { "cxx": [], "nvcc": [ '-D__CUDA_NO_HALF_OPERATORS__', '-D__CUDA_NO_HALF_CONVERSIONS__', '-D__CUDA_NO_HALF2_OPERATORS__', '-gencode', 'arch=compute_80,code=sm_80', # A100 '-gencode', 'arch=compute_89,code=sm_89', # RTX 4090 '-gencode', 'arch=compute_90,code=sm_90' # H100 ], } ``` #### 2. **通过环境变量指定架构** 在编译前设置: ```bash export TORCH_CUDA_ARCH_LIST="8.0;8.6;8.9;9.0" # 包含40系列 cd src python setup.py build develop ``` #### 3. **更新PyTorch和CUDA工具包** 确保环境满足: - **CUDA ≥ 11.8**(40系列必需) - **PyTorch ≥ 2.0**(建议2.1+) ```bash # 检查环境兼容性 nvidia-smi # 查看驱动支持的最高CUDA版本 python -c "import torch; print(torch.__version__, torch.version.cuda)" ``` #### 4. **常见错误修复** - **错误:`nvcc fatal : Unsupported gpu architecture 'compute_89'`** 解决方案:升级CUDA工具包至≥11.8 - **错误:`undefined symbol: __cudaRegisterFatBinaryEnd`** 解决方案:完全清理后重编译: ```bash rm -rf build/ *.so pip uninstall dcnv2 python setup.py build develop ``` - **错误:`error: identifier "__shfl_down" is undefined`** 修改源码: ```cpp // 在.cu文件中替换旧版CUDA函数 __shfl_down(acc, offset) → __shfl_down_sync(0xffffffff, acc, offset) ``` #### 5. **验证安装** ```python import torch from dcn_v2 import DCNv2 layer = DCNv2(3, 16, kernel_size=3).cuda() x = torch.rand(2, 3, 32, 32).cuda() print(layer(x).shape) # 应输出[2,16,30,30] ``` #### 补充建议 1. 使用官方最新分支: ```bash git clone https://github.com/CharlesShang/DCNv2.git ``` 2. 对于Docker用户:基础镜像选择`nvidia/cuda:11.8.0-devel-ubuntu22.04` 3. 若使用PyTorch 2.1+,可尝试`TORCH_CUDA_ARCH_LIST="9.0"`(仅H100需9.0) > **关键原理**:40系列显卡(RTX 4090/4080)使用Ada Lovelace架构(计算能力8.9),旧版DCNv2的编译配置未包含此架构支持,需手动添加`compute_89`和`sm_89`目标代码[^1]。同时需要CUDA 11.8+的编译器支持新架构特性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值