【发布时间】: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;
}
我预计加速与运行该算法的机器数量相关。但是,我观察到在多台机器上运行我的应用程序不会改变执行时间。执行时间似乎与我的主机文件中列出的机器数量无关。
任何想法如何让更多机器的预期行为减少读取时间?
【问题讨论】:
-
太多的变量(例如
p和id)被单化了 -
首先,您必须确保您在可扩展的文件系统上运行。例如,如果 NFS 服务器是瓶颈,则在添加更多节点时性能可能不会像您预期的那样提高。如果在 Lustre 上运行,请确保您的输入文件在足够的 OST 上被剥离。最后但同样重要的是,请改用集体 I/O(例如
MPI_File_real_all_at())。 -
好的。如果是我们实验室的 NFS 系统是瓶颈,我们没有太多时间进行故障排除。我不认为我们在 Lustre 上运行。我们将研究使用 MPI_file_read_all_at()。
-
首先确保您使用的是初始化变量 :-)
-
在初始化它们之前不要使用它们。我鼓励您使用
-Wall进行编译以发现此类问题。