了解 OpenCL 性能

计算科学 表现 克雷洛夫法 维也纳 开放式 并行计算
2021-12-14 15:36:27

我正在使用ViennaCL 的Eigen接口作为利用 OpenCL 的一种方式。具体来说,我将 ::viennacl::linalg::bicgstab_tag与 Eigen 稀疏矩阵一起使用。但是,性能并不是我希望的那样。

我应该使用 Windows 7/Mac OS X/Linux 上的哪些工具来了解性能瓶颈?

2个回答

一般声明:对于小型系统,使用 OpenCL 几乎没有什么好处。

好的,现在说明一下:每次 OpenCL 内核启动都会产生一定的开销。确切的时间取决于底层硬件,但根据经验,可以对 CPU 使用 10 微秒和 GPU 使用 100 微秒的悲观估计,正如我曾经在英特尔 OpenCL 论坛的这个线程中报告的那样. 考虑到现代硬件提供了许多 GFLOP 的处理能力,这是很多。例如,在内存带宽为 100 GB/秒的 GPU 上添加两个具有 100.000 个条目的向量需要传输 3 * 8 * 100.000 字节(约 2MB)的数据,需要 20 us。因此,即使将两个大小为 100.000 的向量相加也会显示出显着的内核启动开销。在实践中,如果内核在另一个内核仍处于活动状态时入队,则可以减少内核启动开销 - 然而,这再次要求内核执行时间足够大。

由于 Krylov 求解器中的大多数操作在复杂性上与向量加法相当(这通常也适用于稀疏矩阵向量乘法),因此系统大小低于 10.000 x 10.000 的基准基本上仅测量 OpenCL 内核启动开销。因此,我建议以 50k x 50k 的上限再次运行基准测试。对于较小的系统规模,只需直接将 BiCGStab 与 Eigen 矩阵一起使用(这是 ViennaCL 提供通用实现的原因之一......)或尝试使用稀疏直接求解器。

对于密集系统(矩阵),“小系统”的概念肯定会转移到更小的值。尽管如此,低于大约 1000x1000 的系统大小的开销再次变得很重要。

一种非常简单的方法是手动计算要完成的有用工作的数量(即要传输的数据量或有用的浮点运算(触发器)的数量或两者兼而有之)。

然后做一些简单的计时并将它们平均以获得给定问题大小(时间与问题大小)的性能的绝对预测,并从中可以评估整体性能特征。这是与硬件规格和/或其他软件的性能进行比较的简单而有用的方法。

此外,要进行完整的性能细分,您将需要 TotalView 等工具来分析和识别性能瓶颈。