当前位置: 代码迷 >> 综合 >> POSIX 线程编程指南(完)
  详细解决方案

POSIX 线程编程指南(完)

热度:50   发布时间:2024-01-09 03:49:35.0

Monitoring, Debugging and Performance Analysis Tools for Pthreads


  监视和调试 Pthreads:

  • 调试器处理Pthreads的能力各异. TotalView 调试器是LC(就是Livermore Computing 的缩写)为并行编程推荐的调试器. 无论是监视还是调试线程化的程序它都是合适的.

  • 下面是来自使用线程化代码的TotalView会话示例抓屏.
    1. 堆栈跟踪面板: 显示了正在执行的所选线程的调用栈例程.
    2. 状态条: 显示所选线程以及和它关联进程的状态信息.
    3. 堆栈帧面板:显示选中线程的堆栈变量,寄存器,等等.
    4. 源面板: 显示选中线程的源代码.
    5. 根窗口显示所有线程
    6. 线程面板: 显示选中进程的相关线程

  • 更多细节请查看 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