7.5.环境列表(Environment List)

本文介绍了程序启动时接收的环境列表,包括其数据结构、如何通过全局变量environ访问环境变量及为何不再将环境列表作为main函数的第三个参数传递的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7.5.环境列表(Environment List)

每一个程序也被传入一个环境列表。象参数列表(argument list)一样,环境列表也是一个字符指针的数组,其中每个指针指向一个以null结束的C字符串(null-terminated C string)。这个指针数组的地址被包含在全局变量environ中:
extern char **environ;
例如,如果环境由五个字符串组成,环境列表可能看起来象图7.5所示的那样。图中我们在每个字符串的末尾显式地表示出了null bytes。我们将把environ叫做环境指针(environment pointer),把指针数组叫做环境列表(environment list),把环境列表指向的字符串们叫做环境字符串(environment strings)。


图7.5.由5个C字符串组成的环境

按照惯例,环境由这样的字符串组成:name=value,就如同在图7.5中看到的那样。大多数人预先确定了name为全部大写,但是这仅是一个惯例。
一直以来,大部分的UNIX系统一直提供了第3个参数给main函数,这第3个参数就是环境列表的地址。如:
int main(int argc, char *argv[], char *envp[]);
因为ISO C指定了main函数只能用2个参数,但是因为提供第3个参数与使用全局变量environ相比,并没有什么优势,所以POSIX.1指定environ代替第3个参数envp。7.9节将会描述到,对某特定环境变量的存取正常情况下是通过函数getenv和putenv,而不是通过变量environ。但是要go through所有的环境,必须使用环境指针environ。


<think>我们正在解决如何设置环境变量 `TORCH_CUDA_ARCH_LIST` 来避免PyTorch编译时的警告。根据引用[1]中的经验,设置这个环境变量可以解决编译问题。同时,用户希望解释如何设置这个环境变量。 步骤: 1. 确定当前GPU的计算能力(Compute Capability)。 2. 根据计算能力设置环境变量 `TORCH_CUDA_ARCH_LIST`。 具体方法: ### 1. 查询GPU的计算能力 可以通过以下命令查询: ```bash nvidia-smi --query-gpu=compute_cap --format=csv ``` 或者访问NVIDIA官方网站查看:https://developer.nvidia.com/cuda-gpus 常见的GPU计算能力对应表(部分): | GPU系列 | 计算能力 | 代码标识 | |----------------|----------|----------| | GeForce RTX 3090 | 8.6 | `sm_86` | | Tesla V100 | 7.0 | `sm_70` | | Tesla T4 | 7.5 | `sm_75` | | A100 | 8.0 | `sm_80` | | RTX 4090 | 8.9 | `sm_89` | | RTX 5000 Ada | 8.9 | `sm_89` | ### 2. 设置环境变量 根据你的GPU计算能力,设置环境变量。例如,如果你的GPU计算能力是8.6,则设置: #### Linux/macOS (临时设置) 在终端执行: ```bash export TORCH_CUDA_ARCH_LIST="8.6" ``` 然后运行你的PyTorch程序。 #### Windows (临时设置) 在命令提示符中执行: ```cmd set TORCH_CUDA_ARCH_LIST=8.6 ``` #### 永久设置(推荐) - **Linux/macOS**:将以下行添加到 `~/.bashrc` 或 `~/.zshrc` 文件中: ```bash export TORCH_CUDA_ARCH_LIST="8.6" ``` 然后运行 `source ~/.bashrc` 或 `source ~/.zshrc` 使其生效。 - **Windows**: 1. 打开“系统属性” -> “高级” -> “环境变量” 2. 在“用户变量”或“系统变量”中新建一个变量: 变量名:`TORCH_CUDA_ARCH_LIST` 变量值:`8.6` ### 3. 验证设置 在Python中运行以下代码检查设置是否生效: ```python import os print(os.environ.get('TORCH_CUDA_ARCH_LIST')) # 应该输出 '8.6' ``` 在编译PyTorch扩展时,这个环境变量会告诉编译器只针对指定的架构进行编译,从而避免警告并加快编译速度。 ### 4. 多GPU架构支持 如果你的机器有多个不同架构的GPU,可以设置多个架构,用分号隔开。例如: ```bash export TORCH_CUDA_ARCH_LIST="7.5;8.6" ``` 这样编译器会为两种架构生成代码。 ### 注意事项 - 确保设置的环境变量在编译之前生效。 - 如果设置后仍然出现警告,请检查是否有其他进程覆盖了环境变量。 - 在Docker容器中,需要在启动容器时设置环境变量,或者在Dockerfile中设置。 引用[1]中提到,在编译MinkowskiEngine时,设置`TORCH_CUDA_ARCH_LIST="8.0"`解决了问题。因此,请根据你的实际GPU架构进行设置。 通过以上步骤,你应该能够解决PyTorch编译时的警告。 §§相关问题§§ 1. 如何查询 NVIDIA GPU 的计算能力? 2. 为什么设置 `TORCH_CUDA_ARCH_LIST` 可以加快编译速度? 3. 在 Docker 容器中如何设置环境变量? 4. 如何为多个不同架构的 GPU 设置 `TORCH_CUDA_ARCH_LIST`?</think>### 如何设置 `TORCH_CUDA_ARCH_LIST` 环境变量解决 PyTorch 编译警告 #### 🔧 设置步骤(按操作系统分类) ##### **Linux/macOS 系统** 1. **临时设置(当前终端有效)** ```bash # 查看GPU计算能力(如RTX 3090为8.6) nvidia-smi --query-gpu=compute_cap --format=csv # 设置环境变量(替换8.6为你的GPU计算能力) export TORCH_CUDA_ARCH_LIST="8.6" ``` 2. **永久设置** ```bash # 编辑bash配置文件 echo 'export TORCH_CUDA_ARCH_LIST="8.6"' >> ~/.bashrc # 立即生效 source ~/.bashrc ``` ##### **Windows 系统** 1. **命令提示符(临时生效)** ```cmd set TORCH_CUDA_ARCH_LIST=8.6 ``` 2. **永久设置** ```powershell # PowerShell管理员权限执行 [System.Environment]::SetEnvironmentVariable('TORCH_CUDA_ARCH_LIST', '8.6', 'User') ``` *或通过图形界面:控制面板 → 系统 → 高级系统设置 → 环境变量 → 新建用户变量* ##### **Python脚本内设置** ```python import os os.environ["TORCH_CUDA_ARCH_LIST"] = "8.6" # 必须在import torch前设置! import torch ``` #### ⚙️ 多GPU架构设置 当服务器有不同架构的GPU时: ```bash # 同时支持RTX 2080 Ti (7.5) 和 RTX 3090 (8.6) export TORCH_CUDA_ARCH_LIST="7.5;8.6" ``` #### ✅ 验证设置效果 ```python import torch print(torch.cuda.get_arch_list()) # 应输出 ['sm_86'] 等目标架构 ``` #### ⚠️ 关键注意事项 1. **设置时机**:必须在导入 PyTorch (`import torch`) 前设置环境变量 2. **架构兼容性**:低计算能力 GPU 无法运行高架构代码(如 `sm_90` 无法在 RTX 2080 Ti 上运行) 3. **常见架构参考**: | GPU 型号 | 计算能力 | 代码标识 | |----------------|----------|----------| | RTX 4090 | 8.9 | `sm_89` | | RTX 3090 | 8.6 | `sm_86` | | RTX 2080 Ti | 7.5 | `sm_75` | | Tesla V100 | 7.0 | `sm_70` | | GTX 1080 Ti | 6.1 | `sm_61` | 4. **编译错误处理**:如遇 `nvcc fatal : Unsupported gpu architecture` 错误,需降低架构版本(如从 `8.6` 改为 `8.0`)[^1] #### 💡 原理说明 设置 `TORCH_CUDA_ARCH_LIST` 后: 1. 编译器仅针对指定架构生成代码 2. 避免为所有兼容架构生成冗余代码 3. 编译时间减少 50-70%,二进制文件体积减小 30-50% 4. 消除 `UserWarning: TORCH_CUDA_ARCH_LIST is not set` 警告 > 提示:完整架构列表见 [NVIDIA CUDA文档](https://developer.nvidia.com/cuda-gpus)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值