让PETSc跑得再快一些
最近做了一个使用PETSc来求解线性方程组(Ax=b)的项目,把其中遇到的一些坑和解决方法记录下来。本文不介绍PETSc如何入门,而是给出一些能让PETSc运行得更快的编程细节。开始我只是简单地修改PETSc给出的范例,替换掉范例中的A和b,能正确运行但运行速度超级慢。后来进行了本文这些细节修改,性能达标,顺利交差了。具体的修改细节如下:
1. PETSc分为debug版本和nodebug版本。如果安装时不加--with-debugging=no选项,安装的就是debug版本。官方文档说nodebug版本比debug版本快2-3倍,我们的项目也确实快了2倍多。
2. 有些非线性问题需要多次求解线性方程组Ax=b,但每次求解方程的系数矩阵A都具有相同的非零结构只是元素的值不同,只在第一次求解方程时创建对象A,b和x,其他次求解时不再创建,仅仅修改对象的值。
3. 在创建矩阵A时,预估(可以多估)每行的非零元个数,使用MatMPIAIJSetPreallocation()分配好存储空间,避免后面设置矩阵元素时开辟新的存储空间。
4. 在设置矩阵A和右端项b的值时,每个进程只设置存储在自己本地的元素,这样可以避免数据的移动。此外,对矩阵A使用MatSetValuesBlocked()逐行进行设置,而不是逐个元素设置。
5. PETSc默认的ksp方法是GMRES,如果矩阵有特殊性质(从物理问题得到的系数矩阵一般都有特殊性质),选择更高效的方法。我们的矩阵是对称正定的,因此使用了CG方法。
6.使用-ksp_monitor查看残差的变化情况,从而设置一个合适的残差上界,避免多余的迭代。
其实这些使用细节官方文档都有,但不是每个人都有时间把272页的文档从头到尾仔细的读一遍,希望这篇博客能帮不熟悉PETSc的同学们节约一些时间。
初次发文,请多指教!
让PETSc跑得再快一些的更多相关文章
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- [翻译] 5点建议,让iOS程序跑得更快
[文章原地址]http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-5-tips-to-increase-app-performanc ...
- 面试官:如何写出让 CPU 跑得更快的代码?
前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...
- 让DB2跑得更快——DB2内部解析与性能优化
让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!) 洪烨著 2013年10月出版 定价:7 ...
- 【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)
[UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1} ...
- 「UR#5」怎样跑得更快
「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...
- 让你的 Node.js 应用跑得更快的 10 个技巧(转)
Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...
- 让你的 Node.js 应用跑得更快的 10 个技巧
Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...
- 让SQL再快一点儿
文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 SQL即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语 ...
随机推荐
- Java 数组拷贝方法 System.arraycopy
System类提供的数组拷贝方法: public static native void arraycopy(Object src, int srcPos, Object dest, int destP ...
- TP5在lnmp环境中不能重写的问题
说到坑,这个问题困扰了我一两天时间,本地可以,线上环境检查了好久. 基本检查的地方有几个了,首先就是nginx下面的重写配置,这个大家在网上都能搜到,至于定义的变量和配置路径,修改一下即可. 还有就是 ...
- oracle学习笔记一:用户管理(2)创建删除用户
本文主要介绍如何创建和删除用户,当然里面牵涉很多知识,慢慢道来. 1,创建用户 需求:假设你是oracle管理员,当一个同事入职,你需要分配给一个账号. 创建用户,一般需要有相应权限的用户才可以创建用 ...
- AngularJS实战之cookie的读取
<!DOCTYPE html> <html ng-controller="cookies_controller"> <head> <tit ...
- Remote Debugging (3)
use Eclipse| a Web application 创建一个简单的web项目 AServlet.java package cn.zno; import java.io.IOException ...
- Linux安装Oracle 11g Grid Infrastructure 出现OUI-10182错误解决办法
已确保安装的ORACLE_BASE目录是属于grid:oinstall 但安装时总是报:OUI-10182 The effective user ID does not match the own ...
- 小组spring计划列表
我们的会议地点:石家庄铁道大学三栋420. 每天进行会议的时间是早上七点钟. 会议内容:主要是讨论当日进行哪一个进程.
- 《ARM Cortex-M3权威指南》笔记(1)
http://blog.csdn.net/roverx/article/details/6624859 第1章 介绍 一.ARM Cortex‐M3处理器初探 CM3处理器内核是单片机的中央处理单元( ...
- noip第9课资料
- 测试pc大、小端
判断计算机的大.小端存储方式 1 int main() { ; char* p=(char*)&a; ) printf("little\n");//小端存储:高位存在地地址 ...