[转]OpenMP学习笔记1 - compile & run

zhsj64 2007-06-18 11:01:56
只讨论基于Linux系统的支持C/C++的OpenMP编程。
homepage: www.openmp.org/
latest version: 2.5
references:
1. OpenMP API version2.5 spec.pdf
2. 从图书馆或网上书店只能找到这一本:
<Parallel Programming in C with MPI and OpenMP> by Miachael J. Quinn 【ISBN】730211157X
中文译本:《MPI与OpenMP并行程序设计C语言版》陈文光、武永卫等译(2004年) 【ISBN】7302095558
//只有一章是介绍OpenMP的其他都是基于MPI讨论并行编程,所以不是很推荐。
3. many PPTs and tutorials on WEB (google them)
----
hands on FAQ:
*怎么在Linux上运行OpenMP程序?
>只需要安装支持OpenMP的编译器即可,比如GCC 4.2以上版本(好像Fedora Core带的部分4.1版本也支持),或者ICC(我用的version 9.1是支持的,其他没试过)。
*怎么缺点编译器是不是支持OpenMP?
>看编译器安装路径下/include目录里有没有omp.h。
*怎么区分OpenMP程序?
>程序中有没有以下内容:
>#include <omp.h>
>#pragma omp ...
*怎么编译OpenMP程序?
>gcc -fopenmp [srcfile] -o [dstfile]
>icc -openmp [srcfile] -o [dstfile]
*怎么运行OpenMP程序?
>编译后得到的文件和普通可执行文件一样可以直接执行。
*怎么设置线程数?
>Method1:在程序中写入set_num_threads(n);
>Method2:export OMP_NUM_THREADS=n;
>两种方法各有用处,前者只对该程序有效,后者不用重新编译就可以修改线程数。
----
Example 1 - hello.c
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel
printf("[%d] Hello\n", omp_get_thread_num());
return 0;
}
results:
$ export OMP_NUM_THREADS=8
$ ./hello
[1] Hello
[0] Hello
[3] Hello
[2] Hello
[7] Hello
[4] Hello
[6] Hello
[5] Hello

Example 2: 矩阵拟合法计算Pi
Sequetial Version:
#include <stdio.h>
#include <time.h>
void main ()
{
time_t start, finish;
static long num_steps = 1000000000;
double step;
int i;
double x, pi, sum = 0.0;
step = 1.0/(double) num_steps;
start = clock();
for (i=0;i< num_steps; i++)
{
x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
}
pi = step * sum;
finish = clock();
printf("Pi = %16.15f (%d steps), %ld ms\n", pi, num_steps, finish-start );
return;
}
Parallel Version:
#include <stdio.h>
#include <time.h>
#include <omp.h>
void main ()
{
time_t start, finish;
static long num_steps = 1000000000;
double step;
int i;
double x, pi, sum = 0.0;
step = 1.0/(double) num_steps;
start = clock();
#pragma omp parallel for reduction(+:sum) private(x) /*只加了这一句,其他不变*/
for (i=0;i< num_steps; i++)
{
x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
}
pi = step * sum;
finish = clock();
printf("Pi = %16.15f (%d steps), %ld ms\n", pi, num_steps, finish-start );
return;
}
result:
Sequential version:
Pi = 3.141592653589792 (1000000000 steps), 13900000 ms
Parallel version for 8 threads:
Pi = 3.141592653589794 (1000000000 steps), 1820000 ms
从结果可以看到8线程的speedup=7.64,接近线性。因为这个程序本身具有良好的并发性,循环间几乎没有数据依赖,除了sum,但是用reduction(+:sum)把对于sum的相关也消除了。而且实验平台本身就有8个处理器核。

当把OMP_NUM_THREAD改成1之后再看看结果:
Pi = 3.141592653589792 (1000000000 steps), 14610000 ms
比串行程序增加了5.1%的overhead,证明增加的1句语句(主要是做任务分配)是有代价的。

再看看把OMP_NUM_THREAD改成大之后的结果:
64 Threads: Pi = 3.141592653589792 (1000000000 steps), 230000 ms - speedup=60.43
128 Threads: Pi = 3.141592653589795 (1000000000 steps), 120000 ms - speedup=116.83
256 Threads: Pi = 3.141592653589794 (1000000000 steps), 120000 ms - speedup=116.83
//这是什么牛机器啊!!!大汗!!!让我怀疑这里出了问题!!!
假设结果是正确的,那么可以看到这个系统的并发极限是128!
我原本想证明的是线程切换是有代价的,所以如果线程数>处理器数(并不等于有几个CPU),加速比就会下降。
但是当线程从128增加到256的时候时间居然也没有变。。。
其实可以在一个单处理器(单核处理器且不支持超线程)上试一下一个8线程的程序会比1线程的程序运行时间长。
----
至于OpenMP的语法请大家自己看书,常用函数也就十来个,很快就能上手。
...全文
4069 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
miaoshasha 2009-10-08
  • 打赏
  • 举报
回复
用难点的程序研究一下openmp呗
intel_www 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jjjjtiger 的回复:]
回楼上的,openmp支持c和fortran
编译器用vc或者ICC都是可以
[/Quote]
vc在2005才开始支持OpenMP.ICC所有版本都支持OpenMP.
jjjjtiger 2008-06-10
  • 打赏
  • 举报
回复
回楼上的,openmp支持c和fortran
编译器用vc或者ICC都是可以
zhangyixian525 2007-10-14
  • 打赏
  • 举报
回复
顺便问一下,openMP用什么开发平台啊。微软的Visual C++吗?那编译器是用VisualC++自带的还是用
英特尔自己的编译器呢。OpenMP主要用来处理那方面的需求呢?请高手指点?
jjjjtiger 2007-10-12
  • 打赏
  • 举报
回复
留个记号
best_dba 2007-06-18
  • 打赏
  • 举报
回复
Good,thanks
michaelxuyw 2007-06-18
  • 打赏
  • 举报
回复
mark
内容概要:本文系统阐述了嵌入式功能安全领域的两大核心标准——IEC 61508与ISO 26262的完整体系,涵盖其定位、关系、技术要求及认证流程。IEC 61508作为通用工业功能安全基础标准,适用于PLC、机器人、轨道交通等系统,采用SIL等级划分;ISO 26262则是其在汽车行业的衍生标准,专用于车载电控单元(如BMS、ESP、自动驾驶控制器),采用ASIL等级评估。文章详细解析了两个标准在风险评估方法(如HARA与风险图法)、软硬件设计规范、失效分析、安全机制实现(如看门狗、CRC校验、冗余设计)等方面的异同,并提供了从需求分析到认证落地的全流程实施路径,包括安全生命周期管理、文档证据链构建及第三方认证机构介绍。; 适合人群:从事工业自动化或汽车电子领域嵌入式系统设计、功能安全开发与认证工作的工程师、项目经理及安全分析师,具备一定电子电气或软件开发背景的专业人员; 使用场景及目标:①指导企业开展符合IEC 61508或ISO 26262的功能安全产品设计与认证;②帮助研发团队理解SIL/ASIL等级判定逻辑与软硬件安全机制实现方式;③支持撰写安全需求文档、FMEDA报告及准备第三方审核材料; 阅读建议:此资源兼具理论体系与工程实践,建议结合具体项目场景对照标准条款进行研读,并重点关注安全生命周期各阶段的交付物要求与典型安全防护设计示例,以提升实际应用能力。

568

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧