Arn*_*ein 4 io parallel-processing mpi output
我有一个非常简单的任务要做,但不知何故我仍然陷入困境。
我有一个大数据文件(“File_initial.dat”),应该由集群上的所有节点读取(使用 MPI),每个节点都会对此大文件的一部分(File_size / number_of_nodes)执行一些操作,最后对每个节点执行一些操作会将其结果写入一个共享的大文件(“File_final.dat”)。文件的元素数量保持不变。
通过谷歌搜索,我了解到,将数据文件写入二进制文件(我在这个文件中只有十进制数字)而不是 *.txt”文件要好得多。因为没有人会读取这个文件,而只会读取计算机。
我尝试自己实现(但使用格式化的输入/输出而不是二进制文件),但我得到了不正确的行为。
到目前为止我的代码如下:
#include <fstream>
#define NNN 30
int main(int argc, char **argv)
{
ifstream fin;
// setting MPI environment
int rank, nprocs;
MPI_File file;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// reading the initial file
fin.open("initial.txt");
for (int i=0;i<NNN;i++)
{
fin >> res[i];
cout << res[i] << endl; // to see, what I have in the file
}
fin.close();
// starting position in the "res" array as a function of "rank" of process
int Pstart = (NNN / nprocs) * rank ;
// specifying Offset for writing to file
MPI_Offset offset = sizeof(double)*rank;
MPI_File file;
MPI_Status status;
// opening one shared file
MPI_File_open(MPI_COMM_WORLD, "final.txt", MPI_MODE_CREATE|MPI_MODE_WRONLY,
MPI_INFO_NULL, &file);
// setting local for each node array
double * localArray;
localArray = new double [NNN/nprocs];
// Performing some basic manipulation (squaring each element of array)
for (int i=0;i<(NNN / nprocs);i++)
{
localArray[i] = res[Pstart+i]*res[Pstart+i];
}
// Writing the result of each local array to the shared final file:
MPI_File_seek(file, offset, MPI_SEEK_SET);
MPI_File_write(file, localArray, sizeof(double), MPI_DOUBLE, &status);
MPI_File_close(&file);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道,在尝试将 double 写入文本文件时我做错了。
应如何更改代码才能保存
你的二进制文件输出几乎是正确的;但是您对文件内偏移量和要写入的数据量的计算不正确。你希望你的偏移量是
MPI_Offset offset = sizeof(double)*Pstart;
Run Code Online (Sandbox Code Playgroud)
不是
MPI_Offset offset = sizeof(double)*rank;
Run Code Online (Sandbox Code Playgroud)
否则,每个等级都会覆盖彼此的数据,例如,等级 3 开始nprocs=5在文件中的双数字 3 处写入,而不是 (30/5)*3 = 18。
另外,你希望每个等级都写NNN/nprocs双打,而不是sizeof(double)双打,这意味着你想要
MPI_File_write(file, localArray, NNN/nprocs, MPI_DOUBLE, &status);
Run Code Online (Sandbox Code Playgroud)
如何写入文本文件是一个更大的问题;您必须在内部将数据转换为字符串,然后输出这些字符串,通过仔细的格式化确保您知道每行需要多少个字符。本网站的这个答案对此进行了描述。
| 归档时间: |
|
| 查看次数: |
10665 次 |
| 最近记录: |