三、 CUDA程序的优化
对于一个问题来说,往往有很多办法可以解决它。选择那个方法,这是一个问题,而且是一个与政策、技术,甚至阴谋相关的问题,具体怎么做,往往考量很多。或者说条件不一样,评判的标准不一样,选择的方法也就不一样。编程也类似,一般来说,不是为了特地使用GPU,就没有必要没有原因就将原来的CPU代码修改为GPU。
说这段话,是因为发现有很多人在不适合GPU的情况下,却使用它,结果当然很坏具了。
使用CUDA可分两种情况,一种是从头到尾从新设计;一种是已经有了串行的版本,但不能满足速度要求,想通过使用CUDA来加快速度,此时可以考虑将代码中最耗时的部分使用CUDA重写。
3.1 选择合适的工具
由于历史的原因,我们目前所使用的串行编程模式是完全一致的,说白了就是以控制为中心,虽然面向对象说是以数据为中心,但是我认为其本质上还是以控制为中心,大家想想看你写面向对象的代码时,其整个中心是不是处理逻辑?是不是系统要做什么?而目前的并行编程模式却分为数据并行和任务并行,或者分布式存储并行和共享存储并行,CUDA是基于数据并行和共享存储器的并行,如果你有OpenMP或者MPI的编程经验,相信你也许也会有这种看法。
所以如果你要解决的问题并不是数据并行的或者共享存储器的,使用CUDA就绝不是一个好的选择。
3.2 优化最应该优化的地方-优化准则
相信很多人都知道80%-20%定律,也就是说程序的80%时间花在执行20%的代码上,如果我们将那20%的代码加速了10倍,最终也才加速一点点,如果我们将那80%加速了一倍,最终的结果将加速近一倍。
根据公式s = 1/(f + (1-f)/p),其中f是程序中串行代码的比重,p是处理器数目。可知f越大,s就越小。这也许解释了nv的说法(尽量让更多的代码在GPU上执行,就算没有加速比)。也就是尽量提高并行代码的比重。这潜在的能够提升程序的并行效率,fermi的某些功能显然是向前迈进了一些,但是nv是不是真的能够达到他们的设想,那就是另一回事了。
对于一个问题来说,往往有很多办法可以解决它。选择那个方法,这是一个问题,而且是一个与政策、技术,甚至阴谋相关的问题,具体怎么做,往往考量很多。或者说条件不一样,评判的标准不一样,选择的方法也就不一样。编程也类似,一般来说,不是为了特地使用GPU,就没有必要没有原因就将原来的CPU代码修改为GPU。
说这段话,是因为发现有很多人在不适合GPU的情况下,却使用它,结果当然很坏具了。
使用CUDA可分两种情况,一种是从头到尾从新设计;一种是已经有了串行的版本,但不能满足速度要求,想通过使用CUDA来加快速度,此时可以考虑将代码中最耗时的部分使用CUDA重写。
3.1 选择合适的工具
由于历史的原因,我们目前所使用的串行编程模式是完全一致的,说白了就是以控制为中心,虽然面向对象说是以数据为中心,但是我认为其本质上还是以控制为中心,大家想想看你写面向对象的代码时,其整个中心是不是处理逻辑?是不是系统要做什么?而目前的并行编程模式却分为数据并行和任务并行,或者分布式存储并行和共享存储并行,CUDA是基于数据并行和共享存储器的并行,如果你有OpenMP或者MPI的编程经验,相信你也许也会有这种看法。
所以如果你要解决的问题并不是数据并行的或者共享存储器的,使用CUDA就绝不是一个好的选择。
3.2 优化最应该优化的地方-优化准则
相信很多人都知道80%-20%定律,也就是说程序的80%时间花在执行20%的代码上,如果我们将那20%的代码加速了10倍,最终也才加速一点点,如果我们将那80%加速了一倍,最终的结果将加速近一倍。
根据公式s = 1/(f + (1-f)/p),其中f是程序中串行代码的比重,p是处理器数目。可知f越大,s就越小。这也许解释了nv的说法(尽量让更多的代码在GPU上执行,就算没有加速比)。也就是尽量提高并行代码的比重。这潜在的能够提升程序的并行效率,fermi的某些功能显然是向前迈进了一些,但是nv是不是真的能够达到他们的设想,那就是另一回事了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23057064/viewspace-663911/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23057064/viewspace-663911/
本文讨论了CUDA程序优化的两个关键方面:选择合适的工具和技术以及优化准则。文章指出,并非所有问题都适合使用CUDA,特别是在非数据并行或不共享存储器的场景下。此外,还强调了优化程序中最耗时部分的重要性。

42

被折叠的 条评论
为什么被折叠?



