当我想在异步发送之后释放资源时,MPI_Bsend 好吗?
这会吗:
MPI_Bsend(&array[0],...)
delete[] array;
阻止我删除我想要发送的内存(问题是,当适当的recv打开时,数组可能已经被删除)?
UPD:
void RectMPIAngleFiller::setglobalFillerbounds1() {
int_t SIZE = getSolver()->getNumInterpolators() * procnums;
int_t gridnums = getSolver()->getNumGrids();
if (layer == 1) {
if (local_rank == 0) {
MPI_Isend(&rank_size, 1, MPI_INT, 0, gridnum, MPI_COMM_WORLD);
}
} else if (layer == 0) {
int_t fillernumber = getSolver()->getNumInterpolators();
int_t local_fillernum = fillernum % fillernumber;
if (local_rank == 0 && local_fillernum == 0) {
int_t * incomeSizes = new incomeSizes[gridnums];
incomeSizes[gridnum] = getSolver()->getNumInterpolators();
for ( int_t i = 0; i < gridnums; i++) {
if (i != gridnum)
MPI_Irecv(&incomeSizes[i], 1, MPI_INT, MPI_ANY_SOURCE, i, MPI_COMM_WORLD, &request);
}
}
}
}
例如,我现在有这样一个函数(现在可能不正确),它从许多进程收集大小,这些进程可能相同但在不同的类实例上运行,这就是为什么一切都与 Send 相关。
该函数在每个实例的外循环中运行,我希望它在整个循环之后完成。
现在它只接收大小,我不想要这个,并且想要删除一些内部数组并根据同一函数中接收到的大小调整它们的大小。如果我有非常大的数组,Isend 中的内部缓冲区太小而无法存储所有信息。