y**b 发帖数: 10166 | 1 标题说是传递指针,实际上是自动传递指针所指对象。
本来MPI传递这类复杂类型(类,含有类的类,含有指针的类,子类,含有类指针
的容器,等等,及其任意组合)是非常麻烦的,但是利用boost.serialization
和boost.mpi,可以轻松传递任意数据类型。
假设sendVec是个含有指针的容器,指针指向某个复杂的类,则
boostWorld.send(0, mpiTag, sendVec); 把这个容器传往主进程0。
主进程通过boostWorld.recv(n, mpiTag, recvVec);接收这个容器,
并自动通过boost.serialization重新生成容器中指针所指的对象,
接收之后recvVec中的指针可以立即投入使用。
一个小小的陷阱就是,使用完recvVec之后,必须手动释放其所含指针
指向的内存,boost无法给用户做这件事。
本来这件事也很明显,但有时候容易疏忽。我的程序在百万次MPI传输后,
主进程使用的内存超过了512GB,超算上的large-memory节点提示OOM,
但是手动释放内存后发现只需要30GB内存。 |
H**r 发帖数: 10015 | |
y**b 发帖数: 10166 | 3 与其说MPI可怕,倒不如说C++的内存管理机制复杂,
有些情况使用智能指针可能会好些。
但我个人的经验,智能指针在这种非常复杂的内存操作中,
反而不如人工控制方便。 |
l*******r 发帖数: 55 | 4 感觉谈不上陷阱,MPI也没法知道什么时候才可以delete,毕竟绝大部分情况下vector
里面都不会存指针的。
我觉得你这种情况,只要养成一个好的习惯,拿到recvVec后立刻转成装unique_ptr的
vector就好了。 |
w***g 发帖数: 5958 | 5 不如用老土的C语言套路明白。
【在 y**b 的大作中提到】 : 标题说是传递指针,实际上是自动传递指针所指对象。 : 本来MPI传递这类复杂类型(类,含有类的类,含有指针的类,子类,含有类指针 : 的容器,等等,及其任意组合)是非常麻烦的,但是利用boost.serialization : 和boost.mpi,可以轻松传递任意数据类型。 : 假设sendVec是个含有指针的容器,指针指向某个复杂的类,则 : boostWorld.send(0, mpiTag, sendVec); 把这个容器传往主进程0。 : 主进程通过boostWorld.recv(n, mpiTag, recvVec);接收这个容器, : 并自动通过boost.serialization重新生成容器中指针所指的对象, : 接收之后recvVec中的指针可以立即投入使用。 : 一个小小的陷阱就是,使用完recvVec之后,必须手动释放其所含指针
|
p***o 发帖数: 1252 | 6 C语言一个realloc就要搞死不少人 ...
【在 w***g 的大作中提到】 : 不如用老土的C语言套路明白。
|
w***g 发帖数: 5958 | 7 realloc有啥问题吗?
【在 p***o 的大作中提到】 : C语言一个realloc就要搞死不少人 ...
|
p***o 发帖数: 1252 | 8 太复杂,大多数程序员搞不定或者懒得搞定。
【在 w***g 的大作中提到】 : realloc有啥问题吗?
|