1.4 并行的替代方法

由于向量化和并行编程的难度和软件开发周期长,很多人不愿意使用它们,但这并不意味着他们不能享有向量多核并行处理器的好处,另外一些方法也能够像并行一样发挥向量多核处理器性能。下面给出了几种简单方法:

·运行同一程序的多个实例;

·利用已有的并行库;

·优化串行程序。

1.运行同一程序的多个实例

如果需要计算同一条件作用在不同的数据集上的效果,或者要计算同一数据集在不同的配置条件下的运行结果。软件开发人员可以在多核处理器上同时为每个数据集运行一次串行程序,这样多个进程可同时占用多个计算核心上的资源。或者为每一种配置条件运行串行程序的一个实例,这样运行每个配置条件的一个实例可占用一个计算核心上的资源,多个不同的实例就可以同时占用多个核心。这些方法并没有减少一次运行的时间(由于资源共享,甚至有可能增加一次运行的时间),但是系统整体的吞吐量会得到提升。

在进行基于深度学习的卷积神经网络实验优化时,经常需要在不同的配置条件下(假设有三个配置,记为A、B、C)学习参数模型,以从多个可选的模型中获得最优的模型。可以分别配置A、B、C运行三个优化实例a、b、c,那么a、b、c可分别在一个核心上运行,这样系统上便有三个核心在运行计算任务,相比只有一个核心在运算,这会提高吞吐量。

如果同时在一个单核机器上运行多个程序,或者在多核处理器上同时运行远超过核心数量的控制流,这可能会既增加单个程序的运行时间,又减少多核处理器整体的吞吐量。

2.利用已有的并行库

目前已经有许多函数库实现了并行,如Intel的MKL、IPP、TBB,以及NVIDIA开发的基于其CUDA计算环境的CUDNN、NPP、CUFFT、CUBLAS等,这些库简化了向量化或并行的设计,使用这些库能够方便地利用多核向量处理器的性能。

NVIDIA的nvblas库使用NVIDIA GPU加速计算密集的blas三级函数。对于原先使用CPU blas三级库函数的应用来说,只需要在编译时链接nvblas库即可利用NVIDIA GPU加速。对于在Linux上运行的调用了blas的应用来说,还可以不用重新编译,只需要在运行程序前使用LD_PRELOAD环境变量让应用使用nvblas中的GPU实现代码即可实现加速。

使用已有的并行库通常比自行编写并行代码要便利,但是要避免由于使用不当,导致性能反而不如标量串行代码的情形。

3.优化串行程序

优化标量串行程序通常应当在向量化或并行之前进行,结果通常会更吸引人。

优化标量串行代码获得的性能提升与向量的长度和核心的数量没有直接的关系,其后还可以利用向量化和并行进一步提升性能。

相比向量化和并行,优化串行代码在操作上通常更容易一些,代码的可扩展性和可维护性通常也更好。

算法的改进获得的性能提升可能是指数级,而向量化或并行带来的性能提升通常和向量长度及核心的数量成正比。