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个设备时的性能相对更好”的结论。

暂无数据
感谢您的宝贵意见。
书中这个例子是总共做向量长度为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的性能。