【发布时间】:2016-01-06 19:17:05
【问题描述】:
我有一个项目,我需要使用 MPI_Isend 和 MPI_Irecv 对 MPI_Bcast 的任何错误实现进行计时,并将其与 MPI_Bcast 进行比较。因为这些程序的时间是 0.000000 秒,所以我需要使用一个大数组(就像我所做的那样)。我下面的代码中还没有的是 for 循环和 MPI_Irecv/Isend 函数应该在一个循环中,以使程序花费大量的时间来完成。
这是我的代码,我将在下面讨论我遇到的问题:
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char **argv) {
int a = 1000000000;
int i, N;
int Start_time, End_time, Elapse_Time;
int proc_rank, partner, world_size;
MPI_Status stat;
float mydata[a];
MPI_Request request;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
Start_time = MPI_Wtime();
for (i = 0; i < a; i++) {
mydata[i] = 0.2567*i;
}
MPI_Irecv(mydata, a, MPI_BYTE, 0, 1, MPI_COMM_WORLD, &request);
MPI_Isend(mydata, a, MPI_BYTE, 0, 1, MPI_COMM_WORLD, &request);
End_time = MPI_Wtime();
Elapse_Time = End_time - Start_time;
printf("Time on process %d is %f Seconds.\n", proc_rank, Elapse_Time);
MPI_Finalize;
return 0;
}
当我使用命令mpirun -np 4 ./a.out 运行它时,我只获得了一个处理器的时间,但我不确定为什么。我想我只是不明白这些功能是如何工作的,或者我应该如何使用它们。
感谢您的帮助!
【问题讨论】:
-
你为你的程序设置了多大的堆栈?大多数操作系统仅提供少量 MiB,因此
mydata[]将非常可能会出现 oveflow => 未定义的行为。 -
我实际上不确定您所说的“设置堆栈”是什么意思。将数组大小更改为更小的值似乎可以降低问题发生的可能性,但它仍然偶尔会发生。
-
谷歌关闭了吗?简单地说:对于
auto变量,数组远太大了。在文件级别使用静态变量 - 无论是static,还是使用外部链接或本地static。我没有说这是唯一的错误。并思考“undefined”的含义。 -
world_size 值是多少?尝试查看它是否与您运行的进程数相同。
-
@CaptainWise 是一样的值
标签: c parallel-processing mpi