搭建开发环境:Python环境配置、必要的库安装、项目目录结构设计
好,咱们正式开始动手了。这一章其实没什么高深的技术,但却是整个项目的地基。我见过太多人一上来就写代码,结果环境没配好,折腾半天连个Hello World都跑不出来。咱们别犯这个错,一步一个脚印来。
Python环境配置
我个人习惯用Python 3.10以上的版本。为什么?因为新版本对类型提示支持更好,咱们写GPU模拟器时类型标注能省不少事。你想想看,一个寄存器几百个字段,没有类型提示,回头自己都看不懂。
先检查你的Python版本:
python --version
如果版本低于3.8,我建议你升级一下。我曾经在3.6上踩过坑——有些语法特性不支持,改代码改到怀疑人生。
推荐用虚拟环境。别嫌麻烦,这是好习惯:
python -m venv gpu_sim_env
source gpu_sim_env/bin/activate # Linux/Mac
# 或者 Windows 下:
# gpu_sim_env\Scripts\activate
虚拟环境的好处是:项目之间互不干扰。你装再多的库,也不会把系统Python搞乱。
必要的库安装
咱们这个项目主要依赖两个库:NumPy和Pygame。说白了,一个管计算,一个管显示。
NumPy
NumPy是GPU模拟器的计算核心。为什么不用纯Python列表?因为慢。GPU模拟器要处理大量并行计算,NumPy的数组操作比Python列表快几十倍。我在做第一个版本时偷懒用了列表,结果一个简单的像素填充跑了3秒——这哪叫GPU,这叫GP慢。
pip install numpy
安装完后验证一下:
python -c "import numpy; print(numpy.__version__)"
看到版本号就对了。
Pygame
Pygame负责把GPU计算出来的画面显示到屏幕上。它其实是个游戏开发库,但用来做模拟器显示正合适——能处理窗口、键盘事件、像素缓冲区。
pip install pygame
验证:
python -c "import pygame; print(pygame.ver)"
注意:如果你在Linux上安装Pygame,可能需要先装SDL依赖库。命令是:sudo apt-get install libsdl2-dev。Windows和Mac用户一般直接装就行。
其他辅助库
还有一些小工具,不是必须的,但我建议装上:
- pytest:写单元测试用。GPU模拟器逻辑复杂,没有测试心里没底。
- black:代码格式化工具。团队协作时统一风格。
pip install pytest black
项目目录结构设计
嗯,这里要注意。目录结构决定了你后面30章能不能写得顺手。我见过最惨的项目——所有代码堆在一个文件里,一万多行,改个bug要找半小时。
咱们的项目结构是这样的:
gpu_simulator/
├── src/
│ ├── __init__.py
│ ├── core/ # 核心模拟器
│ │ ├── __init__.py
│ │ ├── gpu.py # GPU主控
│ │ ├── shader.py # 着色器单元
│ │ └── memory.py # 显存管理
│ ├── display/ # 显示模块
│ │ ├── __init__.py
│ │ └── renderer.py # 渲染器
│ └── utils/ # 工具函数
│ ├── __init__.py
│ └── helpers.py
├── tests/ # 测试代码
│ ├── test_gpu.py
│ └── test_shader.py
├── examples/ # 示例程序
│ └── triangle.py
├── requirements.txt # 依赖清单
└── README.md
为什么这么分?我解释一下:
- core/:放GPU的核心逻辑。包括指令执行、寄存器管理、内存访问。这部分是模拟器的心脏。
- display/:只管显示。从core拿到像素数据,用Pygame画出来。职责单一,好维护。
- utils/:放一些通用函数,比如二进制转换、位操作。这些小工具到处都能用。
- tests/:测试代码单独放。我习惯每个模块对应一个测试文件,找问题快。
小技巧:每个目录下都放一个空的__init__.py文件。这样Python才能把目录当成包来导入。我刚开始学Python时忘了这个,折腾了半天import失败。
创建requirements.txt
这个文件记录所有依赖,方便别人一键安装:
numpy>=1.24.0
pygame>=2.5.0
pytest>=7.0.0
black>=23.0.0
安装时只需要:
pip install -r requirements.txt
验证环境
写个简单的测试脚本,确保一切正常:
# test_env.py
import numpy as np
import pygame
# 测试NumPy
arr = np.array([1, 2, 3, 4])
print(f"NumPy works: {arr.sum()}")
# 测试Pygame
pygame.init()
print(f"Pygame version: {pygame.ver}")
pygame.quit()
print("Environment is ready!")
跑一下:
python test_env.py
看到输出就说明环境搭好了。
避坑指南
最后分享几个我踩过的坑:
- 路径问题:别在项目根目录下直接写代码。把代码放在
src/里,用相对路径导入。我曾经把所有文件平铺在根目录,后来项目大了,找文件像大海捞针。 - 版本冲突:如果你同时做多个Python项目,一定要用虚拟环境。我有个同事没隔离环境,结果一个项目要NumPy 1.19,另一个要1.24,最后两个都跑不起来。
- 编码问题:Windows用户注意,文件路径里别用中文。Pygame在某些中文路径下会报错。我吃过这个亏,后来所有项目都用英文命名。
好了,环境搭好了,目录结构也清楚了。下一章咱们就开始写GPU模拟器的核心——指令集架构。到时候你会看到,这些准备工作有多重要。