3.6.1 缓存模式的模型实现 |
|
模型实现使用3.13节描述的打包和拆包函数, 以及3.7节描述的非阻塞通信函数。
我们假设保留挂起消息输入(PME)的一个环形队列。每个输入包含一个通信请求句柄,用于识别一个挂起的非阻塞发送,还包含一个指向下一个输入的指针及被打包的消息数据。输入被存在缓存中的连续位置。在队尾和队头之间可得到空闲空间。
一个缓存发送的调用导致下列代码的执行。
- 从头到尾顺序扫描PME队列, 删出已完成通信的所有输入, 直到第一个未完成请求的输入;
修改队头指向这个输入。
- 计算存储新消息输入需要的字节数n (用MPI_PACK_SIZE计算打包消息的长度加上请求句柄和指针的空间)。
- 在缓存中找到下一个n字节长的连续空闲空间(跟在队尾的空间, 或如果队尾太接近缓存末尾,
缓存的起始空间)。如果空间没有找到,那么提出缓存溢出错。
- 给在连续空间的PME队尾加这个新输入, 包含请求句柄, 下一个指针和打包的消息数据;
MPI_PACK用于打包数据。
- 邮出打包数据的非阻塞发送( 标准模式 )。
- 返回
Copyright: NPACT
|
|