cuda——测试页锁定内存

/*测试cudaMemcpy()在可分页内存和页锁定内存上的性能差异
步骤:分配一个GPU缓冲区,以及一个同样大小的Host缓冲区,然后在这两个缓冲区上面进行一系列的复制操作。用户指定方向(从主机到GPU定义为up)
为了获得精确的时间统计,我们设计CUDA时间以进行测试*/
#include <stdio.h>
#define N 100//复制的次数
#define SIZE 1024*1024*10

/*在可分页内存上的测试*/
float malloc_test(int size,bool isup){
	cudaEvent_t start,stop;//cuda事件,来标定复制操作的起始时刻和终止时刻
	int *a,*d_a;
	float elapsedTime;
	a = (int*)malloc(size*sizeof(*a));//在主机上分配可分页内存
	cudaMalloc((void**)&d_a,size*sizeof(*d_a));
	cudaEventCreate(&start);
	cudaEventCreate(&stop);

	cudaEventRecord(start,0);
	for(int i = 0;i<N;i++)
		if(isup)//从主机复制到设备
			cudaMemcpy(d_a,a,size*sizeof(int),cudaMemcpyHostToDevice);
		else
			cudaMemcpy(a,d_a,size*sizeof(int),cudaMemcpyDeviceToHost);
	cudaEventRecord(stop,0);
	cudaEventSynchronize(stop);
	cudaEventElapsedTime(&elapsedTime,start,stop);
	free(a);
	cudaFree(d_a);
	cudaEventDestroy(start);
	cudaEventDestroy(stop);	
	return elapsedTime;
}

/*在可页锁定内存上的测试*/
float hostAlloc_test(int size,bool isup){
	cudaEvent_t start,stop;
	int *a,*d_a;
	float elapsedTime;
	cudaEventCreate(&start);
	cudaEventCreate(&stop);
	cudaHostAlloc((void**)&a,size*sizeof(*a),cudaHostAllocDefault);//在主机上分配页锁定内存
	cudaMalloc((void**)&d_a,size*sizeof(*d_a));
	cudaEventRecord(start,0);
	for(int i = 0;i<N;++i)
		if(isup)
			cudaMemcpy(d_a,a,size*sizeof(*a),cudaMemcpyHostToDevice);
		else
			cudaMemcpy(a,d_a,size*sizeof(*a),cudaMemcpyDeviceToHost);
	cudaEventRecord(stop,0);
	cudaEventSynchronize(stop);
	cudaEventElapsedTime(&elapsedTime,start,stop);
	cudaFreeHost(a);//释放页锁定内存的方法
	cudaFree(d_a);
	cudaEventDestroy(start);
	cudaEventDestroy(stop);
	return elapsedTime;
}
int main(){
	float elapsedTime;
	float MB=(float)N*SIZE*sizeof(int)/1024/1024;//总的数据移动量
	elapsedTime = malloc_test(SIZE,false);
	printf("%lf\n",MB/elapsedTime);
	elapsedTime = hostAlloc_test(SIZE,false);
	printf("%lf\n",MB/elapsedTime);
}

### YOLOv5 可复现性配置教程 为了确保 YOLOv5 的训练测试具有良好的可复现性,通常需要关注以下几个方面: #### 1. 虚拟环境配置 为避免不同项目的依赖冲突并保持环境的一致性,推荐使用 `conda` 创建独立的 Python 环境[^1]。以下是创建虚拟环境的具体命令: ```bash conda create -n yolov5_env python=3.8 conda activate yolov5_env ``` 安装必要的库可以通过官方文档中的 `requirements.txt` 文件完成: ```bash pip install -r requirements.txt ``` #### 2. 随机种子固定 YOLOv5 中涉及随机操作的部分(如数据增强、权重初始化等),可能会影响结果的稳定性。因此,在代码中显式设定随机种子是非常重要的。可以在脚本开头加入如下代码来控制随机数生成器的行为: ```python import random import numpy as np import torch def set_seed(seed_value=0): random.seed(seed_value) np.random.seed(seed_value) torch.manual_seed(seed_value) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed_value) set_seed(0) # 设置固定的随机种子值 ``` #### 3. 数据集准备与预处理 对于数据集的划分以及图像增广策略的选择也应尽可能标准化。如果采用自定义的数据增强逻辑,则需将其详细记录下来以便于重复执行相同的流程。 #### 4. 训练参数锁定 在运行多次实验时,应当保存完整的超参设置文件(例如 YAML 格式的配置)。这不仅有助于理解当前使用的具体数值组合,而且便于未来重现该次试验的结果。 #### 5. 使用 GPU 分布式计算注意事项 当利用多卡或者单张高性能图形处理器加速运算速度的时候,记得关闭 cuDNN 自动调优功能以减少不确定性因素的影响。 ```python torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False ``` 以上措施能够极大程度上提高基于 PyTorch 构建框架下目标检测算法——比如这里提到的 YOLO v系列版本之一即 V5 版本——在整个生命周期内的再现可能性。 ### 常见问题及其解决方案 - **Q:** 如果遇到 CUDA OOM 错误怎么办? **A:** 减少 batch size 大小或将输入图片尺寸缩小再试一次即可缓解内存不足的情况发生;另外还可以尝试清理缓存变量释放更多空间给新任务使用。 - **Q:** 怎样验证自己的模型已经成功加载预训练权重? **A:** 打印网络结构查看是否有对应层被更新过, 并且观察 loss 曲线变化趋势是否正常下降. - **Q:** 测试阶段得到预测框坐标偏移较大如何调整? **A:** 检查 anchor box 是否匹配实际场景需求重新聚类生成新的anchors; 同时确认normalize flag 开启状态使得输出归一化到[0,1]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值