C MPI在一个完成后向所有人发送数据
我有一个C程序,它在一个很大的文件中查找某个东西。它是这样工作的:C MPI在一个完成后向所有人发送数据,c,mpi,openmpi,C,Mpi,Openmpi,我有一个C程序,它在一个很大的文件中查找某个东西。它是这样工作的: 查找填充大小fseek(文件描述符,0,查找结束) 按进程数划分 每个进程在其边界之间执行二进制搜索 现在我想做的是,当一个进程找到正在搜索的内容(基本上是偏移量ftell(文件描述符)时,将其发送到所有其他进程 我的方法是这样的: MPI_Irecv(&buffer..., MPI_ANY_SOURCE,... &request); while (condition) { MPI_Test(&
- 查找填充大小
fseek(文件描述符,0,查找结束)
- 按进程数划分
- 每个进程在其边界之间执行二进制搜索
ftell(文件描述符)
时,将其发送到所有其他进程
我的方法是这样的:
MPI_Irecv(&buffer..., MPI_ANY_SOURCE,... &request);
while (condition) {
MPI_Test(&request, &test, &status);
if (test == 1) {
// break since data is in buffer ?
printf("someone told us");
break;
}
//code
if (condition_for_found) {
offset = ftell(file_descriptor);
for (i = 0; i < numprocs; ++i) {
MPI_Send(&offset, ...i, ...);
}
break; // (*)
}
}
MPI\u-Irecv(&buffer…、MPI\u-ANY\u-SOURCE…&request);
while(条件){
MPI_测试(请求、测试和状态);
如果(测试==1){
//因为数据在缓冲区中而中断?
printf(“有人告诉我们”);
打破
}
//代码
如果(找到的条件){
偏移量=ftell(文件描述符);
对于(i=0;i
我没有发布正确的C语法代码,因为我认为这是一个方法问题。
我认为我缺乏理解的是:
和send
的调用次数必须匹配,但是(*)break语句将导致recv
在send
之后被再次调用recv
不总是监视要接收的数据MPI\u Irecv
mpiexec-n 12
会在每5次运行中打印一两次“某人告诉我们的”
我的问题是:当一个进程计算了一些数据时,向其他进程发送数据的方法是什么(接收不应该是阻塞的,发送可能是阻塞的)
我在ubuntu 13.04上使用openmpi-1.6实现,这里的逻辑看起来不错。你的进程是否打破了while循环?我不会依赖printfstatements@kraffenetti我在写评论,但我想我明白了。正如我在帖子中所说的,只是有时候
printf(“有人告诉我们”)是执行的。我想问题在于,对于其余进程,条件将它们从while中中断,因此它们不再测试发送
。我会让它们等待一段时间,然后让您知道发生了什么。