由于只能使用我的学校IP访问我学校的服务器,对不起,没有屏幕截图。我会详细解释。
下面是主文件(不重要)。
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
/** distributing numbers to each node(e.g. distributing 1~100 numbers to 7 nodes: node 1 get 1, 8, 15, 22, ... node 2 get 2, 9, ...) **/
qu = new mpi_que[size];
for (int i = 1; i <= size; i++) {
qu[i-1].setId(i);
qu[i-1].allocate(repeat_number, size - 1);
}
if (myid == MASTER_ID) // 0
Master();
else
Slave();
MPI_Finalize();
这是从功能。
void Slave() {
//printf("I am Slave %d out of %d\n", myid, size - 1);
Sand s(w, h);
while (!qu[myid - 1].isFinished()) {
int id_now = qu[myid - 1].current_id();
int seed = time(NULL) + id_now;
/** Do some Jobs**/
string filename = "./data/avalanche" + ToString(w) + "x" + ToString(h) + "_drop" + ToString(count) + "_id" + ToString(id_now) + ".binary";
writemod(aftershock, aftershock_length, filename);
qu[myid - 1].finishOneJob();
}
}
qu是我创建的全局指针。我认为这里不会发生错误。 qu所做的就是在每个循环中更改id_now的值,因此文件名会在每个循环中更改。
下面是writemod函数。
#define WRITE_VAR(_stream, v) (_stream.write( (char *)(&(v)), sizeof(v) ))
void writemod(afterBig a[], int len, string path) {
ofstream outFile((path).c_str(), ios::binary);
WRITE_VAR(outFile, len);
for (int i = 0; i < len; i++) {
WRITE_VAR(outFile, a[i].big_size);
WRITE_VAR(outFile, a[i].after_size);
}
outFile.close();
}
无论如何,运行此文件时发生的是
如果我运行此文件,则所有输出文件数据似乎都转到[jobname] .o [jobid]文件(默认输出文本文件)。它的容量为8.7Gb,所以我什至无法用emacs打开它以查看发生了什么。