Questions tagged «performance»

有关算法,数据结构,语言和库的执行速度和内存使用情况的问题。

10
有什么好的策略可以改善我的代码的串行性能?
我从事计算科学方面的工作,结果,我花费了大量的时间来尝试提高许多代码的科学吞吐量,并了解这些代码的效率。 假设我已经评估了我正在开发的软件的性能与可读性/可重用性/可维护性之间的权衡,并且我决定是时候提高性能了。我们还假设我知道我没有针对我的问题的更好算法(就flop / s和内存带宽而言)。您还可以假设我的代码库使用的是C,C ++或Fortran之类的低级语言。最后,我们假设代码中没有并行性,或者我们只对单个内核的性能感兴趣。 首先要尝试的最重要的事情是什么?我怎么知道我可以获得多少性能?

7
通过翻牌计数进行算法分析已经过时了吗?
在我的数值分析课程中,我学会了通过计算相对于问题的大小所需的浮点运算(触发器)的数量来分析算法的效率。例如,在Trefethen&Bau的“数值线性代数”一书中,甚至有3D外观的翻牌计数图片。 现在时髦地说“触发器是免费的”,因为获取不在缓存中的任何内容的内存等待时间比触发器的成本大得多。但是,我们仍在教学生数数失败,至少在数值分析课程中是如此。我们应该教他们计算内存访问吗?我们需要写新的教科书吗?还是内存访问太特定于机器而无法花费时间?从瓶颈还是访问内存的角度来看,长期趋势是什么? 注意:以下某些答案似乎是在回答一个不同的问题,例如“我是否应该过分重写我的实现以节省一些触发器或提高缓存性能?” 但是我要问的更多的是“ 用算术运算或内存访问来估计算法复杂性是否更有用?”

4
是什么使Fortran快速?
Fortran在数值编程中占有特殊的位置。您当然可以使用其他语言来制作优质,快速的软件,但是Fortran虽已发展多年,但仍然保持着出色的性能。此外,在Fortran中编写快速程序更加容易。我已经用C ++编写了快速程序,但是您必须更加小心指针别名之类的内容。因此,必须有一个原因,并且是一个非常技术性的原因。是因为编译器可以优化更多吗?我真的很想知道技术细节,因此,如果我使用另一种语言,则可以考虑这些因素。 例如,我知道-或我认为-有一件事是,该标准指定指针在内存中始终是连续的,这意味着更快的内存访问。我相信您可以在C ++中通过向编译器提供标志来做到这一点。通过这种方式,有助于了解Fortran的优势,因此,如果使用其他语言,我们可以效仿。

4
MATLAB反斜杠运算符如何求解平方矩阵的
我将一些代码与“常规” MATLAB代码进行了比较。我对结果感到惊讶。 我运行了一个示例代码(稀疏矩阵) n = 5000; a = diag(rand(n,1)); b = rand(n,1); disp('For a\b'); tic;a\b;toc; disp('For LU'); tic;LULU;toc; disp('For Conj Grad'); tic;conjgrad(a,b,1e-8);toc; disp('Inv(A)*B'); tic;inv(a)*b;toc; 结果: For a\b Elapsed time is 0.052838 seconds. For LU Elapsed time is 7.441331 seconds. For Conj Grad Elapsed time is 3.819182 seconds. Inv(A)*B Elapsed time …


4
有哪些工具或方法可用来加快用Python编写的代码的速度?
背景:我想我可能想移植一些使用Krylov子空间方法从MATLAB到Python来计算矩阵指数矢量乘积的代码。(具体来说,是Jitse Niesen的expmvp函数,该函数使用本文中介绍的算法。)但是,我知道,除非我大量使用了来自编译库的模块中的函数(即,我仅使用原始Python,并且没有很多内置的Python代码,在功能上),那么它可能会很慢。 问题:哪些工具或方法可用来帮助我加快用Python编写的代码的性能?特别是,我对使流程尽可能自动化的工具感兴趣,尽管也欢迎使用一般方法。 注意:我有一个较旧版本的Jitse算法,并且已经有一段时间没有使用它了。快速编写此代码可能很容易,但是我觉得它可以成为一个很好的具体示例,并且与我自己的研究有关。辩论我在Python中实现此特定算法的方法完全是另一个问题。

4
在计算科学中什么时候应该使用C ++表达式模板,什么时候不应该使用它们?
假设我正在使用C ++编写科学代码。在最近与一位同事的讨论中,有人争辩说表达模板可能是一件很糟糕的事情,有可能使软件只能在某些版本的gcc上编译。据推测,这个问题影响了一些科学规范,正如《堕落》这个模仿中的字幕所提到的那样。(这些是我所知道的唯一示例,因此是链接。) 但是,其他人则认为,表达模板很有用,因为它们可以避免将中间结果存储在临时变量中,从而可以提高性能(如SIAM Journal of Scientific Computing的论文)。 我对C ++中的模板元编程一无所知,但我知道这是自动微分和区间算术中使用的一种方法,这就是我讨论表达式模板的方式。考虑到性能方面的潜在优势和维护方面的潜在劣势(即使这是正确的话),我什么时候应该在计算科学中使用C ++表达式模板,什么时候应该避免使用它们?

1
插补多维数据的首选和有效方法是什么?
插补多维数据的首选和有效方法是什么? 我担心的事情: 性能和构造记忆,单次/批处理评估 处理尺寸从1到6 线性或高阶 获得梯度的能力(如果不是线性的) 常规与分散网格 用作插值函数,例如查找根或最小化 外推能力 是否有有效的开源实现? 我对scipy.interpolate和来自scikit-learn的kriging感到幸运。 我没有尝试样条曲线,切比雪夫多项式等。 到目前为止,我在该主题上发现了以下内容: 矩形网格上的Python 4D线性插值 快速插值定期采样的3D数据(在x,y和z中具有不同的间隔) 快速插值常规网格数据 哪种多元分散插值方法最适合实际使用?

3
英特尔Fortran编译器:编译时的优化技巧
我将从我在实验室中的亲身经历开始。在ifort 9天和10天中,我们过去一直非常积极地进行优化,使用-O3和特定于处理器的标志(例如-xW -xSSE4.2)进行编译。但是从ifort 11开始,我们开始注意到: 1.结果中存在一些不一致之处(因为未保留语义) 2.与-O2相比,获得的收益较小。 因此,当前,我们通常仅使用-O2和-xhost进行编译。您是否对ifort 11有更好的建议?当我们过渡到ifort 12时,这种情况会再次改变吗?提前致谢。

1
Python / Numpy数组运算的性能如何随着数组尺寸的增加而缩放?
Python / Numpy数组如何随着数组尺寸的增加而缩放? 这是基于我在对这个问题进行Python代码基准测试时发现的一些行为:如何使用numpy slices表达这种复杂的表达式 问题主要涉及索引以填充数组。我发现在Python循环上使用(不太好)Cython和Numpy版本的优势因涉及的数组大小而异。Numpy和Cython都在一定程度上提高了性能优势(在我的笔记本电脑上,Cython 大约为,Numpy 大约为N = 2000),之后它们的优势下降了(Cython功能仍然是最快的)。N=500N=500N=500N=2000N=2000N=2000 是否定义了此硬件?在处理大型阵列方面,对于那些对性能表现满意的代码,应该遵循哪些最佳实践? 这个问题(为什么我的矩阵向量乘法缩放不为什么?)可能是相关的,但是我有兴趣了解更多有关Python处理数组的不同方式如何相对缩放的信息。

3
预计算后能否在二次时间内求解对角线加固定对称线性系统?
是否存在方法来求解形式为线性系统,其中A为固定SPD矩阵,D_i为正对角矩阵?O(n3+n2k)O(n3+n2k)O(n^3+n^2 k)kkk(Di+A)xi=bi(Di+A)xi=bi(D_i + A) x_i = b_iAAADiDiD_i 例如,如果每个DiDiD_i是标量,则足以计算A的SVD AAA。但是,由于缺乏可交换性,因此对于一般D而言,这种情况会DDD恶化。 更新:到目前为止,答案为“否”。有谁对为什么有任何有趣的直觉?没有答案意味着没有非平凡的方法来压缩两个非交换运算符之间的信息。这并不出乎意料,但是更好地理解它会很棒。

6
使用C ++模板的泛型和元编程在计算科学上有多大用处?
C ++语言通过模板提供通用的编程和元编程。这些技术已进入许多大型科学计算程序包(例如MPQC,LAMMPS,CGAL,Trilinos)。但是,它们在整体开发时间和可用性上是否具有相等或充分的效率,它们实际上对科学计算做出了哪些贡献,这些价值超出了诸如C或Fortran之类的非通用,非元语言。 给定科学计算任务,通过C ++模板进行的通用和元编程是否已证明通过任何易于理解的基准(代码行,人工工作等)衡量的生产率,表达力或可用性方面的改进?相应地,将C ++模板用于通用编程和元编程会带来哪些风险?

4
便携式多核/ NUMA内存分配/初始化最佳实践
当在共享内存环境(例如,通过OpenMP,Pthreads或TBB进行线程化)中执行内存带宽受限的计算时,将存在一个难题,即如何确保内存在物理内存之间正确分配,以使每个线程大部分访问内存中的内存。 “本地”内存总线。尽管接口不是可移植的,但是大多数操作系统都有设置线程相似性的方法(例如,pthread_setaffinity_np()在许多POSIX系统,sched_setaffinity()Linux,SetThreadAffinityMask()Windows上)。还有诸如hwloc之类的库,用于确定内存层次结构,但是不幸的是,大多数操作系统尚未提供设置NUMA内存策略的方法。Linux是一个明显的例外,libnuma允许应用程序以页面粒度操作内存策略和页面迁移(自2004年以来一直在主流中使用,因此已广泛使用)。其他操作系统希望用户遵守隐式的“首次触摸”策略。 使用“首次触摸”策略意味着调用者应在首次写入新分配的内存时以他们打算在以后使用的相似性来创建和分发线程。(很少有系统配置为malloc()实际上可以找到页面,它只是承诺在页面实际出现故障时(可能是由不同的线程)找到它们。)这意味着使用分配calloc()或在分配使用之后立即初始化内存memset()是有害的,因为它易于出错将所有内存分配到运行分配线程的核心的内存总线上,从而导致从多个线程访问内存时出现最坏情况的内存带宽。同样适用于new坚持初始化许多新分配的C ++ 运算符(例如std::complex)。关于此环境的一些观察结果: 可以将分配设为“线程集合”,但是现在分配混入了线程模型,这对于可能不得不使用不同线程模型(也许每个都有自己的线程池)与客户端进行交互的库来说是不希望的。 RAII被认为是惯用C ++的重要组成部分,但它似乎对NUMA环境中的内存性能有积极的危害。new可以将布局与通过malloc()或从中分配的例程一起使用libnuma,但这会改变分配过程(我认为这是必要的)。 编辑:我之前有关运算符的声明new不正确,它可以支持多个参数,请参阅Chetan的回复。我相信仍然需要让库或STL容器使用指定的相似性。可能会打包多个字段,并且可能不方便确保例如std::vector在激活正确的上下文管理器的情况下进行重新分配。 每个线程都可以分配并分配其自己的私有内存,但是将它们索引到相邻区域会更加复杂。(考虑一个稀疏的矩阵向量乘积,其中矩阵和向量按行划分;索引x的未拥有部分时,如果x在虚拟内存中不连续,则需要更复杂的数据结构。)ÿ← A xÿ←一种Xy \gets A xXXxXXx 是否认为NUMA分配/初始化的任何解决方案都是惯用的?我是否遗漏了其他关键陷阱? (我并不是说我的C ++示例暗示要强调该语言,但是C ++ 语言编码了一些有关内存管理的决定,而C之类的语言则没有这样做,因此在建议C ++程序员这样做时往往会有更大的阻力情况有所不同。)

2
函数的有理逼近的开源实现
我正在寻找某种对函数有理近似的开源实现(Python,C,C ++,Fortran都可以)。文章[1]中的内容。我给了它一个函数,它给了我两个多项式,它们的比率是在给定间隔上的近似值,并且误差以相同的幅度振荡,并且是一个最佳近似值,或者接近于它。 这是我发现的: 看起来chebfun可以做到,但我无权使用Matlab *。 在数字食谱(NR)的5-13节“理性切比雪夫近似”中有一个简单的程序。 Mathematica具有EconomizedRationalApproximation和MiniMaxApproximation 我想知道是否有比NR代码更新的东西(可能经过更好的测试)。 我的应用程序是我有一组特殊功能,大约10个,以超几何级数或具有数值抵消的公式给出,我想拥有一个健壮,快速且准确的评估函数,称为Hartree Fock计算中计算两个粒子矩阵元素的最内层循环。我在[2]处提供了一个对我有用的函数的简单示例。如您所见,它要么使用直接公式,要么使用我使用SymPy计算的x = 0周围的序列。它可以工作,但准确性不高,大约x = 1时,大约一半的有效数字会丢失(但是对于x = 0.1以及x = 1e5,它几乎对所有有效数字都是准确的)。我正在寻找更好的近似值。 [1] Deun,J.和Trefethen,LN(2011)。Carathéodory-Fejér方法的有力实现,用于有理逼近。BIT数值数学,51(4),1039–1050。doi:10.1007 / s10543-011-0331-7(2010年6月电子版) [2] https://gist.github.com/3831580 (*)chebfun网站也没有,它给我404,但是Pedro建议这一定是我的提供商问题。

3
迭代方法的比较:迭代次数与cpu时间
我正在比较两种用于反转随机平方矩阵的迭代方法。由于矩阵是随机的,因此每个测试用例都需要不同数量的迭代和不同的经过时间。我的问题是,在平均CPU时间之上,这两种方法所使用的迭代平均值是有用的信息,可用于比较这些方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.