Monitoring, Debugging and Performance Analysis Tools for Pthreads |
监视和调试 Pthreads:
- 调试器处理Pthreads的能力各异. TotalView 调试器是LC(就是Livermore Computing 的缩写)为并行编程推荐的调试器. 无论是监视还是调试线程化的程序它都是合适的.
- 下面是来自使用线程化代码的TotalView会话示例抓屏.
- 堆栈跟踪面板: 显示了正在执行的所选线程的调用栈例程.
- 状态条: 显示所选线程以及和它关联进程的状态信息.
- 堆栈帧面板:显示选中线程的堆栈变量,寄存器,等等.
- 源面板: 显示选中线程的源代码.
- 根窗口显示所有线程
- 线程面板: 显示选中进程的相关线程
- 更多细节请查看 TotalView Debugger tutorial .
- Linux 的 ps 命令提供了查看线程信息的几个标记. 下面的示例展示了一些用法. 更多细节请查看 man page .
% ps -Lf UID PID PPID LWP C NLWP STIME TTY TIME CMD blaise 22529 28240 22529 0 5 11:31 pts/53 00:00:00 a.out blaise 22529 28240 22530 99 5 11:31 pts/53 00:01:24 a.out blaise 22529 28240 22531 99 5 11:31 pts/53 00:01:24 a.out blaise 22529 28240 22532 99 5 11:31 pts/53 00:01:24 a.out blaise 22529 28240 22533 99 5 11:31 pts/53 00:01:24 a.out% ps -T PID SPID TTY TIME CMD 22529 22529 pts/53 00:00:00 a.out 22529 22530 pts/53 00:01:49 a.out 22529 22531 pts/53 00:01:49 a.out 22529 22532 pts/53 00:01:49 a.out 22529 22533 pts/53 00:01:49 a.out% ps -Lm PID LWP TTY TIME CMD 22529 - pts/53 00:18:56 a.out- 22529 - 00:00:00 -- 22530 - 00:04:44 -- 22531 - 00:04:44 -- 22532 - 00:04:44 -- 22533 - 00:04:44 -
- LC 的 Linux 集群也提供 top 命令来监视节点上的进程。如果使用了-H 标志,包含在进程内的线程都将可见。top 的-H 命令的示例如下图所示。 PID 为18010的父进程产生了三个线程,Pid 分别为18012,18013 和 18014 。
- 对线程化程序的性能分析工具很多,最好在web搜索对比下.
- 在 LC, 支持的计算机工具列表可从此处找到: computing.llnl.gov/code/content/software_tools.php.
- 这些工具的复杂度,功能和学习曲线差别很大.详细介绍它们超出了本文的范围..
- 一些工具值得研究,特别是对线程化的代码,包括:
- Open|SpeedShop
- TAU
- HPCToolkit
- PAPI
- Intel VTune Amplifier
- ThreadSpotter
LLNL Specific Information and Recommendations |
本节介绍 Livermore Computing's systems的更多细节.
实现:
- 所有LC产品系统包含了草案10(最终)POSIX标准的Pthreads实现.这是首选实现.
- 在进程能创建线程的最大数量上不一样.默认的线程堆栈空间大小也不同.
编译:
- LC 维护了很多编译器,常常是每个编译器的几个不同版本- 请查看LC's Supported Compilers .
- Compiling Threaded Programs 中描述的编译器指令部分适用于 LC 系统.
混合 MPI 与 Pthreads:
- 这是在LC使用Pthreads的主要动机.
- 设计:
- 每个 MPI 处理典型创建并维护N个线程 , 其中N使得内核/节点的使用最佳化.
- 寻找N的最佳值将随平台以及应用的特性而不同.
- 一般情况下,如果多个线程进行MPI调用可能会导致问题.该程序会失败或者有无法预期的行为. 如果必须在线程内进行MPI调用,那么只能由一个线程去执行这种操作.
- 编译:
- 为所选择的平台和语言选择适当的 MPI 编译命令
- 确保包含 Compiling Threaded Programs 一节中提到的Pthreads标识.
- 下面的示例代码展示了如何同时使用MPI 和 Pthreads . 各个版本分别展示了一种可能的进展.
- Serial
- Pthreads only
- MPI only
- MPI with pthreads
- makefile
没能涉及的主题 |
本文没有包含 Pthreads API 的几个特性. 下面列出来它们. 更多细节请查看 Pthread Library Routines Reference .
- 线程调度
- 对于线程如何调度运行,实现是有差异的.在大多数情况下,默认的机制是合适的.
- Pthreads API 提供了显式设定线程调度策略和优先级的例程(接口),能覆盖默认的机制.
- API 并没有要求实现支持这些特性.
- Keys: 线程本地存储(Thread-Specific Data)
- 当线程调用并从不同的例程返回,线程对展商的数据也随着生灭.
- 为了保留栈数据,可以将它作为参数从一个函数传递给另一个函数,或者将其保存在线程相关的全局变量中.
- Pthreads 通过keys提供了另外一种可能更便利,更多用途的方式达到此目标.
- 处理"优先级反转"的互斥体协议属性和互斥体优先级控制.
- 跨进程条件变量共享
- 取消线程
- 线程和信号
- 同步构造 -桩和锁( barriers and locks)
参考和更多信息 |
- Author: Blaise Barney, Livermore Computing.
- POSIX Standard: www.unix.org/version3/ieee_std.html
- "Pthreads Programming". B. Nichols et al. O'Reilly and Associates.
- "Threads Primer". B. Lewis and D. Berg. Prentice Hall
- "Programming With POSIX Threads". D. Butenhof. Addison Wesley
- "Programming With Threads". S. Kleiman et al. Prentice Hall
附录 A: Pthread 库接口参考 |
- 为了方便,按照字母顺序对Pthread接口进行排列,并链接到它们对应的man page.
pthread_atfork
pthread_attr_destroy
pthread_attr_getdetachstate
pthread_attr_getguardsize
pthread_attr_getinheritsched
pthread_attr_getschedparam
pthread_attr_getschedpolicy
pthread_attr_getscope
pthread_attr_getstack
pthread_attr_getstackaddr
pthread_attr_getstacksize
pthread_attr_init
pthread_attr_setdetachstate
pthread_attr_setguardsize
pthread_attr_setinheritsched
pthread_attr_setschedparam
pthread_attr_setschedpolicy
pthread_attr_setscope
pthread_attr_setstack
pthread_attr_setstackaddr
pthread_attr_setstacksize
pthread_barrier_destroy
pthread_barrier_init
pthread_barrier_wait
pthread_barrierattr_destroy
pthread_barrierattr_getpshared
pthread_barrierattr_init
pthread_barrierattr_setpshared
pthread_cancel
pthread_cleanup_pop
pthread_cleanup_push
pthread_cond_broadcast
pthread_cond_destroy
pthread_cond_init
pthread_cond_signal
pthread_cond_timedwait
pthread_cond_wait
pthread_condattr_destroy
pthread_condattr_getclock
pthread_condattr_getpshared
pthread_condattr_init
pthread_condattr_setclock
pthread_condattr_setpshared
pthread_create
pthread_detach
pthread_equal
pthread_exit
pthread_getconcurrency
pthread_getcpuclockid
pthread_getschedparam
pthread_getspecific
pthread_join
pthread_key_create
pthread_key_delete
pthread_kill
pthread_mutex_destroy
pthread_mutex_getprioceiling
pthread_mutex_init
pthread_mutex_lock
pthread_mutex_setprioceiling
pthread_mutex_timedlock
pthread_mutex_trylock
pthread_mutex_unlock
pthread_mutexattr_destroy
pthread_mutexattr_getprioceiling
pthread_mutexattr_getprotocol
pthread_mutexattr_getpshared
pthread_mutexattr_gettype
pthread_mutexattr_init
pthread_mutexattr_setprioceiling
pthread_mutexattr_setprotocol
pthread_mutexattr_setpshared
pthread_mutexattr_settype
pthread_once
pthread_rwlock_destroy
pthread_rwlock_init
pthread_rwlock_rdlock
pthread_rwlock_timedrdlock
pthread_rwlock_timedwrlock
pthread_rwlock_tryrdlock
pthread_rwlock_trywrlock
pthread_rwlock_unlock
pthread_rwlock_wrlock
pthread_rwlockattr_destroy
pthread_rwlockattr_getpshared
pthread_rwlockattr_init
pthread_rwlockattr_setpshared
pthread_self
pthread_setcancelstate
pthread_setcanceltype
pthread_setconcurrency
pthread_setschedparam
pthread_setschedprio
pthread_setspecific
pthread_sigmask
pthread_spin_destroy
pthread_spin_init
pthread_spin_lock
pthread_spin_trylock
pthread_spin_unlock
pthread_testcancel