初识openMP
openMP
关于并行程序
我写的一个程序运行效率太低了,等不了。所以尝试并行。目前流行的并行程序设计方法是:分布式内存结构上使用MPI,共享内存结构上使用Pthreads或OpenMP。
我这个场合是使用openMP。多个线程的执行顺序是不能保证的。
我们一般并不是要对相同代码在多个线程并行执行,而是,对一个计算量庞大的任务,对其进行划分,让多个线程分别执行计算任务的每一部分,从而达到缩短计算时间的目的。
因为比较赶时间,我只看了最简单的粗暴用法,其中踩到了很多坑,记录在下边了,没有解决的问题也留个记录,以后解决了再修改更新。
正常的openMP
只要正常的程序前边加上以下语句就可以:
# pragma omp parallel
对于需要并行的for循环,在循环之前加上如下语句:
# pragma omp parallel for
运行时需要在编译语句后加上:
-fopenmp
踩过的坑
每次参与运算的线程数目不同。有的线程不参加部分运算
所有的变量都需要在并行的区域里边初始化。如果在外部初始化那么就会出现问题,导致运算结果和非并行情况不一致并且很奇怪。(原理暂且还不清楚)
共享变量与私有变量的问题
计算出来的结果与串行的结果不一样。个人目前分析是因为程序在逻辑上是多个线程执行的,但是他们使用的同样的内存。这就需要搞明白一个事情:在循环内部创造的变量是为每个进程分配一个内存空间还是说仍然是所有进程共用一个同名的内存空间。个人认为是后者,否则计算出来的结果没道理和串行程序有所不同。所以将循环内的变量全部以数组的形式创建,令每个进程占用一个数组的一个小空间。
但是结果还是有小小的不一样,但是误差太小了,可能是精度的问题?
运行时间并没有得到减少
并行程序花费的时间大小与串行程序没有太大的差别。猜想原因可能是产生等待。即在并行程序中,同一时间只允许一个线程访问一个内存那么就会导致线程等待。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现