上个月有幸参加了 Sun 开源技术高级研讨班(青岛)的活动,两天下来收获不小,稍微整理了一点资料,在这里同大家分享下。
第一天讲 Dtrace 和 OpenMP。
Sun 果然是一家技术超前的公司,通过 Solaris 上的 Dtrace,我们可以非常精确的跟踪用户进程,将系统当前状态掌握的了如指掌。
Solaris 中有几万个探针,有点类似于debug断点的概念,它们分布于不同位置;做开发时,我们可借助其找出性能瓶颈,进行优化。
下午的 OpenMP 让我更深入了解了多线程编程。
分享一个动手实验吧:
将下面的程序循环分解并打印出目前正在执行的线程 10分钟
环境要求:
1.Solaris10 或者 Opensolaris 环境
2.已经安装好SUN Studio express 11/08 以上版本
3.如果使用IPS系统需要安装的包: netbeans,netbeans-cpp,netbeans-full,netbeans-ide,netbeans-desktop,sunwlibc,sunwcpp,sunstudioexpress
#include <stdio.h> int main() { int i; for(i=0;i<10;i++) printf("hello,world\n"); return 0; }
步骤:
1)首先我们确定要把这个循环分解到几个线程,县城数目过多而单个线程的任务过少反而会降低程序执行的效率,在这里我们把这个循环分解成两个。(上限不要超过CPU的总CORE数)
2)加入指示性语句 #pragma omp parallel for 语句,并指示线程数 num_threads(2)
#include <stdio.h> int main() { int i; #pragma omp parallel for num_threads(2) for(i=0;i<10;i++) printf("hello,world\n"); return 0; }
3)使用OpenMP的API omp_get_thread_num() 打印目前正在运行的线程号,记住包含omp.h头文件
#include <stdio.h> #include <omp.h> int main() { int i; #pragma omp parallel for num_threads(2) for(i=0;i<10;i++){ printf("hello,world,ID:%d\n",omp_get_thread_num()); sleep(1); //增加观察性 } return 0; }
4)编译#cc -xopenmp -fast lab2o.d
5)运行,观察结果
一点点敲完真累,改天把别的实验也扫描一下贴上来。