Questions tagged «performance»

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

4
如何处理太多数据?
我们的等离子体动力学模拟通常会产生太多信息。在仿真过程中,我们至少在10个属性上将各种物理属性记录在最大(8192x1024x1024x1500)的网格(x,y,z,t)上。仿真完成后,将处理此信息。有了它,我们 拍电影, 进行傅立叶分析, 计算平均性能。 当研究较小的系统时,尽可能多地进行简单的信息转储就可以了。这使我们可以灵活地与结果进行交互,并在以后决定我们要怎么做。它也使我们能够分配计算资源(CPU时间)来简单地运行仿真。 我们已经开始进行动态傅里叶分析的过程,并且仅对选定范围的长度刻度进行过滤。出于数字原因,有时我们需要解析小于实际所需长度的比例尺,因此在这种情况下,此过滤器会很有帮助。我们还在探索各种并行IO库,例如并行I / O选项,尤其是并行HDF5。 有哪些策略可以使数据处理效率最大化? 快速执行所有分析(不包括后期处理,例如电影和情节)是否有任何好处? 我可以想象这个问题会在其他研究领域出现。例如,您可能需要进行长时间的分子动力学模拟,但是您对发生有趣事件的短暂瞬间感兴趣。或在CFD中,早期开发可能会变慢,但是一旦出现动荡,您可能需要更高的时间分辨率来监视动态。 是否有免费提供的从模拟中收集复杂结果的示例?


5
有限元矩阵稀疏结构的计算
问题:有哪些方法可以准确有效地计算有限元矩阵的稀疏结构? 信息:我正在使用Poerson压力方程求解器,使用Galerkin方法和二次Lagrange基础(用C编写),并使用PETSc进行稀疏矩阵存储和KSP例程。为了有效地使用PETSc,我需要为全局刚度矩阵预先分配内存。 目前,我正在做一个模拟程序集,以估计每行非零的数量,如下所示(伪代码) int nnz[global_dim] for E=1 to NUM_ELTS for i=1 to 6 gi = global index of i if node gi is free for j=1 to 6 gj = global index of j if node gj is free nnz[i]++ 但是,这会高估nnz,因为某些节点之间的交互可能会在多个元素中发生。 我已经考虑过尝试跟踪发现的i,j交互,但是我不确定如何在不使用大量内存的情况下执行此操作。我还可以遍历节点,并找到以该节点为中心的基本功能的支持,但是随后我必须搜索每个节点的所有元素,这似乎效率很低。 我发现了这个最近的问题,其中包含一些有用的信息,特别是来自Stefano M的,他写了 我的建议是应用一些图论概念,以python或C语言实现它,即将矩阵中的元素视为图的边并计算邻接矩阵的稀疏结构。列表列表或键字典是常见的选择。 我正在寻找有关此的更多详细信息和资源。我承认我不太了解图论,而且我对所有可能有用的CS技巧都不熟悉(我从数学的角度出发)。 谢谢!

3
使用带指针的派生类型数组时,fortran中的内存使用情况
在此示例程序中,我以两种不同的方式做同样的事情(至少我是这样认为的)。我在Linux PC上运行此程序,并通过top监视内存使用情况。使用gfortran,我发现第一种方式(“ 1”和“ 2”之间)使用的内存为8.2GB,而第二种方式(“ 2”和“ 3”之间)使用的内存为3.0GB。使用英特尔编译器,两者之间的差异更大:10GB与3GB。对于使用指针,这似乎是一个过度的惩罚。为什么会这样? program test implicit none type nodesType integer:: nnodes integer,dimension(:),pointer:: nodes end type nodesType type nodesType2 integer:: nnodes integer,dimension(4):: nodes end type nodesType2 type(nodesType),dimension(:),allocatable:: FaceList type(nodesType2),dimension(:),allocatable:: FaceList2 integer:: n,i n = 100000000 print *, '1' read(*,*) allocate(FaceList(n)) do i=1,n FaceList(i)%nnodes = 4 allocate(FaceList(i)%nodes(4)) FaceList(i)%nodes(1:4) = …

4
库功能的FLOP计数
当用一个简单的函数评估FLOP的数量时,通常只需按基本算术运算符就可以了。但是,在涉及偶数除法的数学语句的情况下,不能做到这一点,并且希望能够与仅具有加法和乘法功能的FLOP计数进行比较。当在库中执行该操作时,情况甚至更糟。因此,必须对特殊功能的性能有一些合理的认识。 通过特殊功能,我们的意思是: exp() sqrt() sin / cos / tan() 通常由系统库提供。 确定它们的复杂性的进一步困惑在于,它们中的许多是自适应的并且具有依赖于输入的复杂性。例如,exp()的数字稳定实现通常会自适应地重新缩放并使用查找。我最初的印象是,在这种情况下最好的方法是确定函数的平均行为。 当然,整个讨论高度依赖于体系结构。在此讨论中,我们可以将自己局限于传统的通用体系结构,并排除具有特殊功能单元(GPU等)的那些体系结构。 为了系统与系统之间的比较,人们可以找到相当简单的尝试来针对特定体系结构进行标准化,但是如果人们在乎方法与方法的性能,这是不可接受的。确定这些功能的FLOP复杂度的哪些方法被认为可以接受?有什么大陷阱吗?

2
在python中计算非常大且稀疏的邻接矩阵的所有特征值的最快方法是什么?
我试图找出一种比使用scipy.sparse.linalg.eigsh更快的方法来计算非常大且稀疏的邻接矩阵的所有特征值和特征向量,据我所知,此方法仅使用稀疏性和矩阵的对称属性。邻接矩阵也是二进制的,这使我认为有一种更快的方法可以实现。 我创建了一个随机的1000x1000稀疏邻接矩阵,并在x230 ubuntu 13.04笔记本电脑上比较了几种方法: scipy.sparse.linalg.eigs:0.65秒 scipy.sparse.linalg.eigsh:0.44秒 scipy.linalg.eig:6.09秒 scipy.linalg.eigh:1.60秒 对于稀疏的eigs和eigsh,我将所需特征值和特征向量的数量k设置为矩阵的秩。 问题始于更大的矩阵-在9000x9000矩阵上,scipy.sparse.linalg.eigsh花了45分钟!

2
倍频程:计算两个向量矩阵之间的距离
假设我有两个分别代表N,M个2d向量的矩阵Nx2,Mx2。有没有一种简单而又好的方法来计算每个向量对(n,m)之间的距离? 简单但低效的方法当然是: d = zeros(N, M); for i = 1:N, for j = 1:M, d(i,j) = norm(n(i,:) - m(j,:)); endfor; endfor; 我找到的最接近的答案是bsxfun,用法如下: bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6]) ans = -2 -1 0 1 -3 -2 -1 0 -4 -3 -2 -1 -5 -4 -3 -2

3
在哪些应用案例中加性预处理方案优于乘法式预处理方案?
在域分解(DD)和多网格(MG)方法中,可以将块更新或粗略校正的应用组合为加法或乘法。对于逐点求解器,这是Jacobi和Gauss-Seidel迭代之间的差异。为乘法平滑充当小号(X ø 升d,b )= X Ñ ë 瓦特当施加甲X = bAx=bAx = b小号(xÒ 升d,b )= xñ Ë W ^S(xold,b)=xnewS(x^{old}, b) = x^{new} X我+ 1= Sñ(Sn − 1(。。。,小号1个(x一世,b )。。。,b ),b )xi+1=Sn(Sn−1(...,S1(xi,b)...,b),b) x_{i+1} = S_n(S_{n-1}( ..., S_1(x_i, b) ..., b), b) 然后将添加剂平滑剂应用为 X我+ 1= x一世+ ∑ℓ = 0ñλℓ(Sℓ(x一世,b )− x一世)xi+1=xi+∑ℓ=0nλℓ(Sℓ(xi,b)−xi) x_{i+1} = x_{i} …

2
科学代码性能的基本结构是什么?
考虑两台具有不同硬件和软件配置的计算机。在每个平台上运行完全相同的序列Navier-Stokes代码时,分别需要花费x和y的时间分别为计算机1和2执行一次迭代。在这种情况下,是计算机1和计算机2之间的迭代时间差。Δ = x - yΔ=X-ÿ\Delta = x-y 可能会影响的大小?一个明显的候选者是CPU,我的主要问题是,是否还有其他因素可能会影响与CPU之间的硬件差异相同?ΔΔΔ\DeltaΔΔ\Delta

1
HPC中本地内存/计算,网络延迟和带宽抖动的统计模型
并行计算通常使用确定性的本地计算速率,等待时间开销和网络带宽来建模。实际上,这些是空间可变的和不确定的。诸如Skinner和Kramer(2005)之类的研究观察到多峰分布,但是性能分析似乎总是使用确定性或高斯分布(不仅是不准确的,而且由于负潜伏期的正概率也不一致)。 是否开发了高保真统计模型?是否考虑了本地计算/内存,延迟和带宽可变性之间的互相关性?

3
如何实现两个粒子积分<ij | kl>的有效索引功能?
这是一个简单的对称枚举问题。我在这里提供了完整的背景知识,但是不需要量子化学知识。 这两种粒子组成是: ⟨ 我Ĵ | ķ 升⟩ = &Integral; ψ * 我(X)ψ * Ĵ(X ')ψ ķ(X)ψ 升(X ')⟨ 我Ĵ | ķ 升⟩⟨一世Ĵ|ķ升⟩\langle ij|kl\rangle 它有以下4个对称性: ⟨ 我Ĵ | ķ 升⟩ = ⟨ Ĵ 我| 升ķ ⟩ = ⟨ ķ 升| 我Ĵ ⟩ = ⟨ 升ķ | Ĵ 我⟩ 我已计算在一维数组的积分,并将它们存储的函数,索引如下:⟨ 我Ĵ | …

3
Nvidia K20X与GeForce Titan进行GPGPU加速
我试图了解这两种用于学术计算的图形卡之间的区别,特别是对于DGEMM组件。 如果我们看原始统计数据,它们都有相同的GK110芯片,几乎在每个类别中都有可比较的统计数据,而且我相信它们具有相同的核心体系结构。不计任何折扣,K20X的价格大约是Titan的4倍。从效率的角度来看,在K20X上使用Titan似乎很有意义。 我很难理解这里的区别,有人可以阐明情况吗? 需要注意的是,我正在考虑为机架服务器购买这些卡,并基本上以完全倾斜的方式运行直到它们消失为止。但是,我认为对单个作业使用多个GPU的效率并不是特别重要。

1
在科学计算的背景下,C ++ 11 move语义会产生什么影响?
C ++ 11引入了移动语义,例如,在C ++ 03需要执行副本构造或副本分配的情况下,可以提高代码性能。该文章报道说,下面的代码与C + 11编译经历了5倍加速: vector&lt;vector&lt;int&gt; &gt; V; for(int k = 0; k &lt; 100000; ++k) { vector&lt;int&gt; x(1000); V.push_back(x); } 在科学计算的背景下,C ++ 11 move语义会产生什么影响? 我对这个问题很感兴趣,但更具体地说,我对使用Boost库编写的有限元代码的移动语义也很感兴趣。我使用增强版1.47.0(因为增强版发行说明中提到了移动语义是在1.48.0中引入的)和增强版1.53.0 (使用增强版1.47.0)测试了自己的一些C ++ 03代码,但是我没有注意到太多改进。我想任何积蓄从不必为做复制建筑boost::numeric::ublas::vector/ matrix和boost::function不显着的,因为求解系统矩阵构成块体的工作量。 编辑:实际上,似乎只为移动语义实现了boost::function(请参见1.52.0版发行说明)。中没有提到移动语义boost::numeric,我将源代码拼凑起来以确保没有似乎右值引用。

3
文献参考,用于对浮点运算和数据传输的当前和未来能源成本进行建模
我正在寻找最重要的文献和幻灯片参考,以对浮点操作以及跨CPU,内存,网络和存储的数据传输的当前和未来能源成本进行建模。我已将此问题标记为社区Wiki,并且我希望您将每个答案限制为以下格式: 标题,作者,位置/会议/期刊,年份,DOI / URL,论文或演示文稿提供的与我的要求相关的信息摘要。

3
稀疏矩阵乘法的开销是多少
矩阵乘法(Mat * Mat和Mat * Vec)是否随非零数或矩阵大小缩放?或两者的某种组合。 形状呢? 例如,我有一个100 x 100的矩阵,其中包含100个值,或者一个1000 x 1000的矩阵,其中包含100个值。 当对这些矩阵求平方(或将它们乘以具有相似稀疏性的相似矩阵)时,第一个(100x100)是否比第二个(1000x1000)快?是否取决于值在哪里? 如果它取决于实现,那么我对PETSc的答案很感兴趣。

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.