1
运行时
怎样比较多DCU与单DCU计算性能?
2023-05-25 12:04:54
107

 DCU开发与使用文档第3.6章节--单进程多DCU编程,介绍了一个算例:数组相加,采用单DCU和多DCU计算性能的比较。比较的语句如下:

// record start time
Common::Timer timer;
timer.start();
double iStart = timer.seconds();

......

// calculate the elapsed time in seconds
timer.stop();
double iElaps = timer.seconds() - iStart;
printf("%d DCU timer elapsed: %8.2fms \n", ngpus/ngpus, iElaps * 1000.0/ngpus);

不明白最后语句为什么要除以ngpus。按照我的理解,应该比较实际用了多少时间,即将1DCU所用时间与4DCU所用时间去比较,如果4DCU所用时间小于1DCU所用时间,那么增加DCU是有提升计算性能,节约计算时间效果的(先不论加速比)。
因此最后语句应该改写成:
printf("%d DCU timer elapsed: %8.2fms \n", ngpus, iElaps * 1000.0);

这样,按照我的测试结果:
4 DCU timer elapsed: 61.34ms
2 DCU timer elapsed: 38.31ms
1 DCU timer elapsed: 21.21ms
实际上多个DCU反而使得计算时间更长了,计算性能降低的。这样不能得出文档中所说的:“对比输出结果可以看到,使用4个设备时的性能相对更好”的结论。

全部评论(1)
只看楼主
C
cwoody
1楼

感谢您的宝贵意见。

书中这个例子是总共做向量长度为16M、单精度的两个向量相加,将这些工作平均分给多个DCU。

您提到的:

“因此最后语句应该改写成:

printf("%d DCU timer elapsed: %8.2fms \n", ngpus, iElaps * 1000.0);”这个意见是正确的。

之所以会出现使用4DCU比1DCU更慢,原因在于向量长度16M(占用内存64MB)所带来的数据传输量与计算量对于DCU来说太小了,相比这些实际工作的耗时,反而是主机端在启动数据传输与启动DCU核函数时的耗时占了绝大部分。对于1DCU来说,主机端需要启动2次数据传输与1次核函数,而对于4DCU来说,主机端需要启动8次数据传输与4次核函数,这就导致对于这种工作负载,1DCU比4DCU更快。

您可以尝试将控制向量长度的ishift从24修改为,比如说,29,这样总的向量长度从16M变为512M,再对比1DCU和4DCU的性能。
2023/5/25
没有更多内容了
--
楼主
Level.1
0 帖子
楼主热帖
暂无数据