c - MPI_Send 和 MPI_Recv,测量 1Mb 消息的传输时间

标签 c mpi message

我正在尝试使用 MPI_Send 和 MPI_Recv 发送大小为 1Mb 的消息,并测量发送该消息需要多长时间。这是我的 C 代码。

#include <stdio.h>
#include <mpi.h>
#include <assert.h>
#include <sys/time.h>

int main(int argc,char *argv[])
{

   int rank,p;
   struct timeval t1,t2;

   MPI_Init(&argc,&argv);
   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
   MPI_Comm_size(MPI_COMM_WORLD,&p);

   printf("my rank=%d\n",rank);
   printf("Rank=%d: number of processes =%d\n",rank,p);

   assert(p>=2);


if(rank==0) {
            int x[255] = { 0 };
            int dest = 7;
            int i = 0;
            while (i<254)
            {
                    x[i] = 255;
                    i++;
            }
            gettimeofday(&t1,NULL);
            MPI_Send(&x[0],255,MPI_INT,dest,1,MPI_COMM_WORLD);
            gettimeofday(&t2,NULL);
            int tSend = (t2.tv_sec-t1.tv_sec)*1000 + (t2.tv_usec-t1.tv_usec)/1000;

            printf("Rank=%d: sent message %d to rank %d; Send time %d millisec\n", rank,*x,dest,tSend);
} else
if (rank==7) {
            int y[255]={0};
            MPI_Status status;
            gettimeofday(&t1,NULL);
            MPI_Recv(&y[0],255,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
            gettimeofday(&t2,NULL);
            int tRecv = (t2.tv_sec-t1.tv_sec)*1000 + (t2.tv_usec-t1.tv_usec)/1000;
            printf("Rank=%d: received message %d from rank %d; Recv time %d millisec\n",rank,*y,status.MPI_SOURCE,tRecv);
}

MPI_Finalize();
}

这段代码编译和运行都很好,但它总是说它在 0 毫秒内完成发送和接收,这是不可能的。我猜我发送数组的语法是错误的,所以我只是发送 4 个字节或其他内容,但我无法弄清楚。

如有任何帮助,我们将不胜感激!

最佳答案

也许更好的衡量时间的方法是以微秒为单位衡量时间

(t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec

看看你是否得到任何值。

关于c - MPI_Send 和 MPI_Recv,测量 1Mb 消息的传输时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39585897/

相关文章:

java - 消息正文中的 Amazon SQS 无效二进制字符

mpi - 有人可以提出一种理解 MPI 工作原理的好方法吗?

fortran - 为什么这两个 MPI-IO 代码的工作方式不同?

c++ - 如何使用 MPI_Type_create_subarray?

android - 在默认的 AlertDialog 中居中消息

php - 我如何在 php 中获取 mysql 警告消息(不是错误)

php - 有人熟悉PHP源代码吗?

c - 如何获取两行之间的用户输入

c - 逻辑出了什么问题?

c - 使用指针在按值传递函数中模拟按引用传递(C 和 C++)