《CUDA高性能并行计算》----3.2 并行化dist_v2

本 节 书 摘 来 自 华 章 出 版 社 《CUDA高性能并行计算》 一 书 中 的 第3章,第3.2节, 作 者 CUDA for Engineers: An Introduction to High-Performance Parallel Computing[美] 杜安·斯托尔蒂(Duane Storti)梅特·尤尔托卢(Mete Yurtoglu) 著,苏统华 项文成 李松泽 姚宇鹏 孙博文 译 , 更 多 章 节 内 容 可 以 访 问 云 栖 社 区 “华 章 计 算 机” 公 众 号 查 看。
3.2 并行化dist_v2

第一个并行化的距离应用dist_v1_cuda不具有充分的代表性,因为它并没有涉及大量输入数据。现在我们已经准备好了并行化第二个距离应用dist_v2,这是一个更加典型的例子,涉及对一个输入数组的操作。将一个数组数据传递到GPU的策略并不复杂:

1.在设备内存(GPU)上创建一个数组,类型和大小与主机内存(CPU)上的输入数组一致。

2.在设备内存上创建一个内存用来存储输出的数据。(你可以选择使用复用输入数组的办法存储输出,但是目前我们先将输入和输出分开考虑。)

3.将主机端的输入数组复制到设备内存上对应的数组上。

4.启动核函数进行计算并将输出值存储在设备内存上的输出数组中。

5.将设备内存中的输出数组复制回主机内存中的对应数组上。

6.释放设备上的数组内存。

上面列出的步骤很适合dist_v2的组织方式,其中包括了一个main.cpp文件(包含了main()函数的代码),一个单独的文件(名为aux_functions.cpp)来包含定义辅助功能的代码,一个头文件(名为aux_functions.h)来包含像distanceArray()函数一样的原型函数,使其可以在其他文件中被“看见”并调用(例如main.cpp文件)。

因为步骤4中涉及CUDA核函数调用,我们将aux_functions.cpp(及其对应的头文件)替换为kernel.cu(及其对应的头文件—kernel.h)。完整的代码在代码清单3.3、代码清单3.4以及代码清单3.5中显示,代码清单3.6是Makefile文件。


9a2c05249f7605e25ca1fb051829dd7ec88b8855

Dist_v2_cuda/main.cpp 的代码与dist_v2/main.cpp几乎一样。不同之处包括把scale()移到main.cpp中,并引用kernel.h来代替原来的aux_functions.h文件。最大的变化发生在kernel.cu文件中新定义的distanceArray()函数中。


c1a6cc5af8d76b5a549525356853b2281a2c75ed

这里需要强调几个要点:
1. distanceKernel()函数与dist_v1_cuda/kernel.cu中的版本有明显的不同。这里,形参包含了一个指针d_in,指向一个已经被构建好的输入数组。

2.对于distanceArray()新的定义执行了上面所列出的全部5个步骤。设备端的输入输出数组在第23~28行代码中定义;输入数据从主机端复制到设备端在第31行执行;从核函数调用并获取GPU并行化的执行结果在第43行;输出的距离值从设备端复制到主机端在第37行;设备端的内存释放在第40行和第41行。

3.函数distanceArray()调用核函数distance-Kernel()。这样的函数被称为封装(warpper)或者启动函数(launcher)。


eced5668df386f81e1da2f44a0f41fb0aa37cac0


7dd5166a76153095bf137455ad1abacb7a180829

读者可以用这些现成的代码编译并执行dist_v2_cuda。验证这些距离的值是否被正确计算,并且留意一下所有关键的CUDA代码都包含在kernel.cu文件中。对比distanceArray()函数在dist_v2/aux_functions.h和dist_v2_cuda/kernel.h中的原型。注意这些原型是完全相同的,但是函数的定义却被改变了。用软件开发的术语来说,我们改变了实现但是保持接口不变。这种方式为已有程序开发支持CUDA的版本提供了解决思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码主要是用来训练一个名为CenterFusion的目标检测模型,使用了DDDet(一个基于PyTorch的目标检测框架)。其中: - export CUDA_DEVICE_ORDER=PCI_BUS_ID export CUDA_VISIBLE_DEVICES=0,1:设置使用哪些GPU进行训练。 - cd src # train:进入src目录下进行训练。 - python main.py:运行main.py文件,即训练脚本。 - ddd:指定使用的模型是DDDNet。 - --exp_id centerfusion:设置训练实验的名称为centerfusion。 - --shuffle_train:在每个epoch开始前,打乱训练集的样本顺序。 - --train_split mini_train:使用mini_train作为训练集。 - --val_split mini_val:使用mini_val作为验证集。 - --val_intervals 1:设置每隔1个epoch进行一次验证。 - --run_dataset_eval:在训练过程中进行数据集的评估。 - --nuscenes_att:使用nuscenes属性进行训练。 - --velocity:使用速度信息进行训练。 - --batch_size 24:设置batch size为24。 - --lr 2.5e-4:设置学习率为2.5e-4。 - --num_epochs 60:设置训练的总epoch数为60。 - --lr_step 50:设置学习率下降的epoch数。 - --save_point 20,40,50:设置保存模型的epoch数。 - --gpus 0:设置使用的GPU编号为0。 - --not_rand_crop:不使用随机裁剪。 - --flip 0.5:进行数据增强时,以0.5的概率进行翻转。 - --shift 0.1:进行数据增强时,以0.1的概率进行平移。 - --pointcloud:使用点云数据进行训练。 - --radar_sweeps 3:设置雷达扫描数为3。 - --pc_z_offset 0.0:设置点云高度偏移量为0.0。 - --pillar_dims 1.0,0.2,0.2:设置pillar的尺寸为1.0*0.2*0.2。 - --max_pc_dist 60.0:设置点云距离的最大值为60.0。 - --load_model ../models/centernet_baseline_e170.pth:加载已经训练好的centernet_baseline_e170.pth模型。 - # --freeze_backbone \:注释掉的代码,原本可以冻结骨干网络,使得训练更加稳定。 - # --resume \:注释掉的代码,原本可以从已经训练好的模型继续训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值