加载中...
搜索中...
无匹配项
libcuspatial 中的单元基准测试

libcuspatial 中的单元基准测试是使用 NVBench 编写的。虽然一些现有基准测试是使用 Google Benchmark 编写的,但新的基准测试应该使用 NVBench。

NVBench 库类似于 Google Benchmark,但在进行 GPU 基准测试时有几项用户体验改进,例如显示达到的峰值内存带宽百分比以及 GPU 硬件的详细信息。

NVBench 和 Google Benchmark 都提供了许多选项,用于指定要进行基准测试的参数范围,以及控制报告的时间单位等。请参考 cpp/benchmarks 中现有的基准测试来了解这些选项。

目录和文件命名

单元基准测试目录和源文件的命名应与被测试的功能保持一致。例如,distance.hpp 中 API 的基准测试应位于 cpp/benchmarks/distance/ 中。每个功能(或一组相关功能)都应有自己的基准测试源文件,命名为 <功能>{.cu,cpp}

CUDA 异步性与基准测试准确性

CUDA 计算和像复制这样的操作通常相对于主机代码是异步的,因此仔细同步非常重要,以确保在您进行基准测试的功能完成之前,基准测试计时不会停止。cpp/benchmarks/synchronization/synchronization.hpp 中提供了一个 RAII 辅助类 cuda_event_timer 来帮助解决此问题。此类别还可以选择清除 GPU L2 缓存,以确保缓存命中不会在重复迭代中人为地夸大性能。

数据生成

为了生成基准测试输入数据,cpp/benchmarks/utility/random.cuh 中提供了随机数据生成函数。输入数据生成在设备上进行。

应该进行哪些基准测试?

一般来说,我们应该对各种数据大小和类型的所有功能进行基准测试,以便能够发现 libcudf 更改带来的性能退步。然而,运行大量基准测试成本很高,因此理想情况下,我们应该以一种能够获得良好覆盖范围而无需详尽测试的方式来采样参数空间。

一个经验法则是,我们应该使用足够的数据进行基准测试,以达到算法达到其饱和瓶颈(无论是带宽还是计算)的点。使用大于此点的数据集通常没有帮助,除非在特定情况下,这样做可以练习不同的代码,从而发现较小的基准测试无法发现的性能退步(这种情况应该很少见)。

一般来说,我们应该对公共 API 进行基准测试。只有当从公共 API 基准测试中难以充分检测到细节函数和/或内部工具中的性能退步时,才应该对它们进行基准测试。