Questions tagged «efficiency»

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。

3
标准库中的计算成本是多少?
分子模拟中必须处理的主要问题之一是距离相关力的计算。如果我们可以将力函数和距离函数限制为分离距离偶次幂,则只需计算距离的平方即可,而不必担心。但是,如果有奇数次方,则需要处理。rrrr2=r⋅rr2=r⋅rr^2 = {\bf r \cdot r}rrrr=r2−−√r=r2r = \sqrt{r^2} 我的问题是:在通用语言(C / C ++,Fortran,Python)等库中实现的计算成本是多少?通过手动调整特定体系结构的代码,确实可以获得很多性能改进吗?x−−√x\sqrt{x}
26 efficiency 

3
粒子分解和域分解并行化算法的优缺点是什么?
我正在使用几个软件包(例如Gromacs和DL_POLY)运行分子动力学(MD)模拟。 Gromacs现在支持粒子分解和域分解算法。默认情况下,Gromacs模拟使用域分解,尽管直到最近,多年以来,粒子分解是Gromacs中唯一实现的方法。在Gromacs的一篇论文(DOI 10.1002 / jcc.20291)中,作者给出了最初选择粒子分解的原因: “早期的设计决策是选择使用粒子分解而不是域分解来将工作分配到处理器上。在后一种情况下,将空间域分配给处理器,这使得仅通过本地通信即可快速找到空间邻居,但是会带来复杂性对于跨越空间边界的粒子而言,域分解是一个更好的选择,只有当线性系统的大小大大超出相互作用范围时,分子动力学中才很少发生这种情况,通过粒子分解,每个处理器都可以计算力和坐标/速度更新对于预先分配的粒子,使用预先计算的邻居列表均匀分布在处理器上。F我 ĴF一世ĴF_{ij}从颗粒之间的一对相互作用产生一世一世i 和ĴĴj,这是需要两种粒子的速度更新和 一世一世iĴĴj,仅计算一次,并传达给其他处理器。每个处理器将系统的完整坐标集保留在其本地内存中,而不是将存储限制在所需的坐标范围内。这更简单并节省了通信开销,而内存要求通常根本不是限制因素,即使对于数百万个粒子也是如此。另一方面,可以包含多达1000倍粒子数量的邻居列表分布在处理器上。基本上,通信仅限于围绕处理器环的每个时间步发送一次坐标和力。这些选择随着时间的推移被证明是可靠的,并且很容易适用于现代处理器集群。” 句子“仅当线性系统的大小大大超过相互作用范围时,才是域选择是一个更好的选择,这在分子动力学中很少见”,它们是什么意思?从上面的段落中,我得到一种想法,即粒子分解的优点是不必处理跨域边界移动的粒子。相反,您只需要为每个处理器有足够的内存来存储整个系统配置即可。因此,粒子分解看起来非常有利,而域分解看起来非常不利。 我确信这是一个非常复杂的问题(可能是许多书籍的主题),但是基本上,如果粒子分解看起来如此有利,为什么有人需要使用域分解? 如果系统规模很大(使每个处理器都难以或不可能存储整个配置),则域分解是否有利?基于上面引用的段落,我不确定为什么最近刚将域分解作为Gromacs中的默认并行化算法。 似乎现在的DL_POLY(版本4)也使用域分解。从版本4手册中: “以这种方式对配置数据进行划分是基于原子在模拟单元中的位置,系统数据的这种几何分配是DD算法的特点。请注意,为了使该策略有效地起作用,系统必须具有合理均匀的密度,以便为每个处理器分配几乎相等的原子数据部分(尽可能多),通过这种方法,在处理器和该方法在概念上很简单,尽管编程很麻烦,但在概念上却很简单,特别适合效率最高的大规模仿真。 ... 在使用DD策略的情况下,SHAKE(RATTLE)算法比DL_POLY Classic的“复制数据”方法更简单,后者需要原子位置的全局更新(合并和剪接)。” 这听起来好像域分解是好的,因为它可能更有效,即使可能更难以实现。 另一方面,以前的版本(DL_POLY Classic)使用了复制数据并行化,这似乎是粒子分解的另一个名称。从该版本的手册中: 复制数据(RD)策略是在MD中实现并行化的几种方法之一。从配置数据的并行计算机中的每个节点(在复制其名称导出即阵列限定的原子坐标,速度 ,和力,对于全部[R一世[R一世\textbf{r}_iv一世v一世\textbf{v}_iF一世F一世\textbf{f}_iññN在模拟系统中的每个原子都在每个处理节点上重现。在这种策略中,大多数力的计算和运动方程的积分可以在节点之间轻松而平等地共享,并且在很大程度上可以在每个节点上独立进行处理。该方法编程相对简单并且相当有效。而且,它很容易在单个处理器上“崩溃”运行。但是,该策略在内存中可能很昂贵,并且具有较高的通信开销,但总的来说,它已被证明在各种应用程序中都是成功的。 该段似乎与该问题的第一段基本一致,不同之处在于它说复制的数据/粒子分解具有“高通信开销”。Gromacs论文的段落似乎相反-粒子分解是更可取的,因为它比域分解具有较低的通信开销。 你有什么想法吗?

3
具有大数据集的计算问题的I / O策略?
我的研究小组专注于分子动力学,分子动力学显然可以生成千兆字节的数据作为单个轨迹的一部分,然后必须对其进行分析。 我们关注的几个问题涉及数据集中的相关性,这意味着我们需要跟踪内存中的大量数据并对其进行分析,而不是使用更多的顺序方法。 我想知道的是将大型数据集的I / O处理为脚本的最有效策略是什么。我们通常使用基于Python的脚本,因为它使对文件I / O的编码比使用C或Fortran的痛苦少得多,但是当我们有成千上万的行需要处理时,尚不清楚最好的方法是什么。我们应该考虑使用C语言编写文件输入部分,还是另一种策略更有用?(简单地将整个数组预加载到内存中会比一系列顺序读取“块”(兆字节)更好吗? 一些附加说明: 因此,我们主要是在寻找用于后处理的脚本工具,而不是“在线”工具-因此要使用Python。 D = 16林Δ 吨→交通∞⟨ (X(吨+ Δ 吨)- X(吨))2⟩d=1个6林ΔŤ→∞⟨(X(Ť+ΔŤ)-X(Ť))2⟩D = \frac{1}{6} \lim_{\Delta t \rightarrow \infty} \left< \left( {\bf x}(t + \Delta t) - {\bf x}(t) \right)^2 \right>
15 python  c  efficiency 

2
在Matlab中编写“ for”循环的最有效方法是什么?
我已经读过,例如,如果我有一个for在矩阵索引上运行的双循环,那么将列运行索引放在外部循环中会更有效。例如: a=zeros(1000); for j=1:1000 for i=1:1000 a(i,j)=1; end end 如果我有三个或更多for循环,最有效的编码方式是什么? 例如: a=zeros(100,100,100); for j=1:100 for i=1:100 for k=1:100 a(i,j,k)=1; end end end

1
查找与计算成本
我有兴趣进行计算以检查是否满足距离标准:即向量和花药向量x j之间的距离应小于某个值r m a x。我的数据根据​​坐标的正交网格进行分区。由于我的临界值小于最近邻坐标的端点之间的距离,因此我想添加一个“ octant”变量来检查设置是否正确:xixi{\bf x}_ixjxj{\bf x}_jrmaxrmaxr_{\rm max} if octant[j] in allowed_list continue 作为“短路” if dist(x[i], x[j]) &lt; r_max 我的问题是:布尔查找和比较相对于浮点运算的计算效率如何?这在现代建筑上值得吗?
12 efficiency 

2
自动分化何时便宜?
自动微分使我们能够对特定输入上的程序的派生进行数值评估。有一个定理,这种计算的成本不到运行原始程序的成本的五倍。这个五分之一是一个上限。 在什么情况下可以进一步降低成本?许多现场派生代码以接近原始程序的速度运行。如何获得这种加速? 可以利用原始程序的哪些特征来加快计算速度? 可以采用哪些软件工程技巧来加快计算速度?

3
是否有之间的复杂
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为计算科学堆栈交换的主题。 5年前关闭。 是否存在大于小于的复杂度?O (n log n )O(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n \log n)

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

4
快速准确地实现不完整伽玛函数的双精度
最新的实现双精度特殊功能的方式是什么?我需要以下积分: 对于和,可以用较低的不完全伽马函数来表示。这是我的Fortran和C实现:米=0,1,2,。。。Fm(t)=∫10u2me−tu2du=γ(m+12,t)2tm+12Fm(t)=∫01u2me−tu2du=γ(m+12,t)2tm+12 F_m(t) = \int_0^1 u^{2m} e^{-tu^2} d u = {\gamma(m+{1\over 2}, t)\over 2 t^{m+{1\over 2}}} m=0,1,2,...m=0,1,2,...m=0, 1, 2, ...t&gt;0t&gt;0t>0 https://gist.github.com/3764427 它使用级数展开,将各项相加直到达到给定的精度,然后使用递归关系有效地获得较低值。我对其进行了很好的测试,获得了我需要的所有参数值的1e-15精度,有关详细信息,请参见Fortran版本的注释。mmm 有没有更好的方法来实现它?这是gfortran中的gamma函数实现: https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781 它使用有理函数逼近而不是总结一些我正在做的无穷级数。我认为这是一种更好的方法,因为应该获得统一的精度。是否有某种规范的方法来处理这些问题,还是必须为每种特殊功能找出一种特殊的算法? 更新1: 根据评论,这是使用SLATEC的实现: https://gist.github.com/3767621 它从我自己的函数中复制值,大致在1e-15精度级别上。但是,我注意到一个问题,对于t = 1e-6和m = 50,项等于1e-303,对于更高的“ m”,它只是开始给出错误的答案。我的函数没有这个问题,因为我直接对使用了一系列扩展/递归关系。这是一个正确值的示例: ˚F米tm+12tm+12t^{m+{1\over2}}FmFmF_m F100F100F_{100}(1e-6)=4.97511945200351715E-003, 但是我无法使用SLATEC来实现这一点,因为分母会爆炸。如您所见,的实际值很小。FmFmF_m 更新2: 为避免上述问题,可以使用该函数dgamit(Tricomi的不完全Gamma函数),然后F(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2,因此不再存在问题,但是不幸的是,。然而,这可能是足够高的,我的目的。米≈ 172 米tttgamma(m+0.5_dp)m≈172m≈172m\approx 172mmm
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.