Math “你怎么看?”;扩展;BLAS子程序?

Math “你怎么看?”;扩展;BLAS子程序?,math,fortran,linear-algebra,lapack,blas,Math,Fortran,Linear Algebra,Lapack,Blas,通常,BLAS子例程是为特定的唯一操作定义的。比如说, DAXPY必然是y首先,在您对y的解释中,因为您使用的是MKL,所以可以使用扩展DAXPBY,它确实是y我建议您使用Fortran 95数组表示法编写自己的例程,看看编译器是否能够生成合适的代码。我怀疑会这样,因为带宽有限的操作几乎被naive实现所耗尽,即gurus编写的优化BLAS1库实现可能不会比未优化的Netlib BLAS1快多少,除非数据已经驻留在缓存中(在这种情况下,矢量化将产生一些效果) 我在过去做过这样的比较,发现对于任何

通常,BLAS子例程是为特定的唯一操作定义的。比如说,


DAXPY
必然是
y首先,在您对y的解释中,因为您使用的是MKL,所以可以使用扩展DAXPBY,它确实是
y我建议您使用Fortran 95数组表示法编写自己的例程,看看编译器是否能够生成合适的代码。我怀疑会这样,因为带宽有限的操作几乎被naive实现所耗尽,即gurus编写的优化BLAS1库实现可能不会比未优化的Netlib BLAS1快多少,除非数据已经驻留在缓存中(在这种情况下,矢量化将产生一些效果)


我在过去做过这样的比较,发现对于任何不驻留在缓存中的向量,优化和未优化的BLAS1样式例程之间的差异可以忽略不计。

为什么需要
y
?你真的只想计算
z=ax+bax
?真的,我认为没有好的答案,因为这些东西可能会根据向量的长度、正在运行的硬件、编译器和库版本等而改变。此外,如果你使用的是最新的英特尔fortran(12.2),有时,我发现简单的内在操作的运行速度与MKL调用的运行速度相同或更快。@Talonmes,它们是两种不同的操作,在我的代码中的许多地方都会发生。不一定并列。@laxxy,我想如果有人告诉我哪种方法行不通,我会非常高兴。每次我更改矩阵时,我都会花2个小时来找出哪种方法工作得很好。你可能对候选方法已经有了很好的了解:)现在,如果情况经常发生变化,你可以尝试编写几个备选方案,在改变情况后,在改变情况时运行一个小基准,以自动选择其中一个,例如,使用shell脚本或类似的东西。我尝试过ATLAS,但在大多数情况下,它比Intel MKL慢得多。我可能会再试一试。最让我头疼的是,对于长度为100k的全密度向量,一个简单的a=b Fortran操作有时比DCOPY(100k,a,1,b,1)快得多!据我所知,BLAS没有提供您想要的操作。我不认为ATLAS比MKL优越(在解决复杂问题时,人总是比机器更强大:)。我刚才说过,您可以使用他们采用的方法来编写类似的东西,以帮助您在计算机上找到合适的实现。至于复制操作,也许使用平铺算法(逐块执行)来解决所描述的任务更方便,减少任务大小并根据解决时间选择最佳的平铺大小?我的OpenMP实现也是这样。这是一个外观相当简单的代码,它可以为每个线程分配一定数量的工作。最重要的是,我做了一些初步的微优化,以确保我的内存流和工作共享是最佳的。但遗憾的是,Clint Whaley一直在编写no use.ATLAS。OpenMP绝对是带宽限制问题的解决方案。在许多情况下,每个节点需要使用多个核心来饱和峰值带宽。例如,在Blue Gene/Q上,您需要16个线程来最大化流三元组基准。
`z = ax + by`: DCOPY(n,z,1,y,1), then DAXPBY(n,a,x,1,b,z,1)
`y = ax`: DAXPBY(n,a,x,1,0,y,1)