【问题标题】:MPI: Distributing segments of large file does not speedup executionMPI:分配大文件的段不会加速执行
【发布时间】:2021-01-24 07:11:53
【问题描述】:

我有一个大型生物信息学文件 (fasta),我正在使用 MPI 根据当前程序的 ID 在特定区域打开文件。然后,我将氨基酸序列转录成相应的蛋白质。


#include <mpi.h>
int main(int argc, char* argv[]){
  MPI_File in;
  int id;
  int p;
  long buffersize = 3000000000/p;
  MPI_Offset fileStart = buffersize * id;
  char* nucleotides = (char*)malloc(buffersize);
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &id);
  MPI_Comm_size(MPI_COMM_WORLD, &p);
  MPI_File_open(MPI_COMM_WORLD, argv[1], MPI_MODE_RDONLY, MPI_INFO_NULL, &in);
  MPI_File_read_at(in, fileStart, nucleotides, buffersize, MPI_CHAR, MPI_STATUS_IGNORE);
  /* Calculations */
  /* Write result */
  MPI_File_close(&in);
  free(nucleotides);
  MPI_Finalize();
  return 0;
}

我预计加速与运行该算法的机器数量相关。但是,我观察到在多台机器上运行我的应用程序不会改变执行时间。执行时间似乎与我的主机文件中列出的机器数量无关。

任何想法如何让更多机器的预期行为减少读取时间?

【问题讨论】:

  • 太多的变量(例如pid)被单化了
  • 首先,您必须确保您在可扩展的文件系统上运行。例如,如果 NFS 服务器是瓶颈,则在添加更多节点时性能可能不会像您预期的那样提高。如果在 Lustre 上运行,请确保您的输入文件在足够的 OST 上被剥离。最后但同样重要的是,请改用集体 I/O(例如 MPI_File_real_all_at())。
  • 好的。如果是我们实验室的 NFS 系统是瓶颈,我们没有太多时间进行故障排除。我不认为我们在 Lustre 上运行。我们将研究使用 MPI_file_read_all_at()。
  • 首先确保您使用的是初始化变量 :-)
  • 在初始化它们之前不要使用它们。我鼓励您使用-Wall 进行编译以发现此类问题。

标签: c mpi


【解决方案1】:

要将 cmets 变成答案: 转这个

#include <mpi.h>
int main(int argc, char* argv[]){
  MPI_File in;
  int id;
  int p;
  //you are using p uninitialized here!!!
  long buffersize = 3000000000/p;
  //same applies to id
  MPI_Offset fileStart = buffersize * id;
  char* nucleotides = (char*)malloc(buffersize);
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &id);
  MPI_Comm_size(MPI_COMM_WORLD, &p);
  MPI_File_open(MPI_COMM_WORLD, argv[1], MPI_MODE_RDONLY, MPI_INFO_NULL, &in);
  MPI_File_read_at(in, fileStart, nucleotides, buffersize, MPI_CHAR, MPI_STATUS_IGNORE);
  /* Calculations */
  /* Write result */
  MPI_File_close(&in);
  free(nucleotides);
  MPI_Finalize();
  return 0;
}

进入这个:

#include <mpi.h>
int main(int argc, char* argv[]){
  MPI_File in;
  MPI_Init(&argc, &argv);
  int id;
  int p;
  MPI_Comm_rank(MPI_COMM_WORLD, &id);
  MPI_Comm_size(MPI_COMM_WORLD, &p);
  long buffersize = 3000000000/p;
  MPI_Offset fileStart = buffersize * id;
  char* nucleotides = (char*)malloc(buffersize);
  MPI_File_open(MPI_COMM_WORLD, argv[1], MPI_MODE_RDONLY, MPI_INFO_NULL, &in);
  MPI_File_read_at(in, fileStart, nucleotides, buffersize, MPI_CHAR, MPI_STATUS_IGNORE);
  /* Calculations */
  /* Write result */
  MPI_File_close(&in);
  free(nucleotides);
  MPI_Finalize();
  return 0;
}

不保证其余部分是否可以正常工作。 我强烈建议在开始编写 MPI 代码之前让自己熟悉 C 编程,因为你可能最终会迷路。 MPI 问题很难调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2017-08-22
    • 2018-03-02
    • 2018-03-04
    相关资源
    最近更新 更多