Download presentation
Presentation is loading. Please wait.
1
核探测与核电子学国家重点实验室 报告人:董磊 指导老师:宋克柱
陆上小型地震仪主控软件设计 核探测与核电子学国家重点实验室 报告人:董磊 指导老师:宋克柱
2
内容 1 陆上小型地震仪简介 2 主控软件功能需求 3 主控软件结构 4 并行计算的应用
3
陆上小型地震仪简介
4
主控软件功能需求 存储 功能 监测 测试 采集 存储 监测 测试 测试小型地震仪技术指标 实现正常采集数据的功能 存储测试结果及正常采集数据
监测和回放采集数据的指标
5
软件结构 核心控制模块 提供共享数据库 完成数据存储 软件接口模块 采集模块 测试模块 通过USB与硬件通信
配置采集参数,下传采集命令,提供图形监测界面 配置测试参数,下传测试命令,提供图形化测试结果 核心控制模块 采集模块 测试模块 提供共享数据库 完成数据存储
6
软件基本工作流程 开始 初始化 系统测试 正常采集 数据回放
7
初始化
8
系统测试
9
正常采集
10
数据回放
11
初始化过程 超时自动返回 线程自动销毁 发送初始化命令 接收数据 通知主线程 初始化线程 抛出初始化线程 等待 等待 继续执行 主线程
12
系统测试(循环测试情况) 系统测试线程 主线程 系统测试线程 数据处理线程 主线程 事件锁定 接收数据 发消息到主线程 等待事件
发送测试命令 主线程 抛出测试线程 等待消息 等待消息 分析消息 系统测试线程 等待事件 等待事件 发送测试命令 事件置位 数据处理线程 处理数据 …(完成) 事件置位 线程自动销毁 主线程 抛出处理线程 等待消息 等待消息 判断消息类别
13
多线程 是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理: (1)耗时或大量占用处理器的任务阻塞用户界面操作;
是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理: (1)耗时或大量占用处理器的任务阻塞用户界面操作; (2)某个任务必须等待外部资源 (如远程文件或 Internet连接)。 (3)并行计算:多核已经成为了主流。传统的应用程序再也无法顺其自然地在更高端的硬件设备上获得更高的性能回报,并行计算已经成为软件开发的核心趋势之一。
14
串行计算和并行计算对多核CPU利用情况
15
并行计算(Parallel computing)
16
CMP: Chip-level multiprocessing
适合PC应用程序使用的API 目前,适合在CMP平台上使用的并行编程模式OpenMP、Pthreads等;MPI实现的是进程级并行,更多的是用于Cluster(集群)系统。 VS2010支持OpenMP 2.0标准。 同时,VS2010还提供一种称之为“并发运行时”的编程框架。除此之外还有Windows API提供的线程操作接口。 CMP: Chip-level multiprocessing
17
OpenMP 和并发运行时(Concurrency Runtime)
当并行度是预先确定的并且和系统上的可用资源相匹配时,OpenMP 效率较高。 OpenMP 模型特别适合于高性能计算。 在此方案中,硬件环境是已知的,开发人员可以合理地期望在执行该算法时拥有对计算资源的独占访问权。 但是,其他约束较少的计算环境可能不是 OpenMP 的绝佳匹配。 例如,使用 OpenMP 更难以实现递归问题(如数据的 quicksort 算法或搜索树)。 通过提供并行模式库 (PPL) 和异步代理库,并发运行时对 OpenMP 的功能进行了补充。 与 OpenMP 不同,并发运行时提供动态计划程序,该计划程序可以适应可用资源并且在工作负荷更改时调整并行度。 它包含一套编译指令,库例程,影响运行时间的环境变量,除了SMP之外,还有非共享内存的多核结构,如MPP、Cluster、Grid
18
本软件中的并行计算
19
串行处理CPU资源利用 DrawGraph:0.720s CaculateRMSValue:0.380s
20
并行处理CPU利用 速度提升 MonitorTreadFun:0.452s DrawGraph:0.720s 1.59 VS
DrawGraphTreadFun:0.177s CaculateRMSValue:0.380s 2.14
21
资源监视器看到的情形
22
Posix Thread #include <pthread.h> #include <stdio.h>
#include <stdlib.h> #include <assert.h> #define NUM_THREADS 5 void *TaskCode(void *argument) { int tid; tid = *((int *) argument); printf("Hello World! It's me, thread %d!\n", tid); /* optionally: insert more useful stuff here */ return NULL; } int main(void) pthread_t threads[NUM_THREADS]; int thread_args[NUM_THREADS]; int rc, i; /* create all threads */ for (i=0; i<NUM_THREADS; ++i) thread_args[i] = i; printf("In main: creating thread %d\n", i); rc = pthread_create(&threads[i], NULL, TaskCode, (void *) &thread_args[i]); assert(0 == rc); } /* wait for all threads to complete */ rc = pthread_join(threads[i], NULL); assert(0 == rc); exit(EXIT_SUCCESS);
23
OpenMP #include <omp.h> #include <stdio.h>
#include <stdlib.h> #define SIZE 10 int main() { int i; int a[SIZE]; #pragma omp parallel for num_threads(4) for (i = 1; i < SIZE; i++) { if (a[i] > max) { #pragma omp critical { if (a[i] > max) max = a[i]; } } printf_s("max = %d\n", max);
24
并发运行时 // parallel-for-structure.cpp // compile with: /EHsc
#include <ppl.h> #include <array> #include <sstream> #include <iostream> using namespace Concurrency; using namespace std; int wmain() { // Print each value from 1 to 5 in parallel. parallel_for(1, 6, [](int value) { wstringstream ss; ss << value << L' '; wcout << ss.str(); }); }
25
Thank You!
Similar presentations