SCR
Adding SCR to Your Application
如何在应用程序中使用SCR?官方给出的示例如下:
int main(int argc, char* argv[]) {
MPI_Init(argc, argv);
/* Call SCR_Init after MPI_Init */
SCR_Init();
for (int t = 0; t < TIMESTEPS; t++) {
/* ... Do work ... */
/* Ask SCR if a checkpoint should be saved (optional) */
int need_ckpt;
SCR_Need_checkpoint(&need_ckpt);
if (need_ckpt)
checkpoint(t);
}
/* Call SCR_Finalize before MPI_Finalize */
SCR_Finalize();
MPI_Finalize();
return 0;
}
void checkpoint(int timestep) {
/* Define a name for our checkpoint */
char name[256];
sprintf(name, "timestep.%d", timestep);
/* Tell SCR that we are starting a checkpoint phase */
SCR_Start_output(name, SCR_FLAG_CHECKPOINT);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* Define our checkpoint file name */
char file[256];
sprintf(file, "%s/rank_%d.ckpt", name, rank);
/* Register our checkpoint file with SCR,
* and obtain path we should use to open it */
char scr_file[SCR_MAX_FILENAME];
SCR_Route_file(file, scr_file);
/* Each process will inform SCR whether it wrote
* its checkpoint successfully */
int valid = 1;
/* Use path from SCR to open checkpoint file for writing */
FILE* fs = fopen(scr_file, "w");
if (fs != NULL) {
int rc = fwrite(state, ..., fs);
if (rc == 0)
/* Failed to write, mark checkpoint as invalid */
valid = 0;
fclose(fs);
} else {
/* Failed to open file, mark checkpoint as invalid */
valid = 0;
}
/* Tell SCR that we have finished our checkpoint phase */
SCR_Complete_output(valid);
return;
}
要点总结:
1.每个检查点文件都有一个时间步与之对应,应用的一次运行会有很多个时间步,所以会有很多版本的检查点文件。
2.最开始每个进程各自对应一个文件路径file,但是后面又调用了SCR_Rount_file(),对文件路径进行了路由,返回一个新的路径,可能在新的路径下能够有更好的读写性能,总之各个进程最终是通过路由后的路径写数据的。路由过程中发生了什么,仅通过接口看不来答案。
3.看起来好像整个检查点阶段仅对文件进行一次写入,所有需要保存的数据都一次性写入。(怎么能够的?fwrite调用一次也就能写入一个规整的数组吧?就这么点东西要保存吗?而且这个state我也没看懂,这是要用户自己决定需要保存哪些数据?那SCR还有什么用?)
Assumptions
虽然SCR的宗旨是支持多种类型的应用程序,但是SCR在实现过程中有许多假设,如果任意一个假设没有得到满足,应用程序可能就不能完全地使用SCR的所有特性。
1.应用程序必须是MPI程序;
2.如果想要较高的性能,应用程序必须让所有进程同步并且每个进程独占一个文件进行读写。虽然SCR也支持共享文件读写,但是相比于独占文件,性能有所下降。
3.如果想要重启过程具有可扩展性,一个应用必须保证重启进程的数量和当初建立检查点时候的数量一致,并且每个重启进程只能读自己当初所写的数据。有的应用在重启时,重新启用的进程数量可能和之前建立检查点时的进程数量不一样,SCR对这样的应用也能支持,但是必须将SCR配置为从PFS重启(那一致重启时数据是存储在本地的?从PFS重启是不是意味着当初写数据时是直接写入到PFS而不是写到BB上?)。
4.在应用创建检查点的时候,很有可能应用会把所有检查点文件存储在同一个目录下,因此应用自己要注意对不同进程的检查点文件进行可区分的命名,对于不同版本的检查点文件,也由应用自己进行可区分的命名。(相当于SCR本身不提供版本管理?BB会爆炸的)
5.SCR要求每个检查点文件只保存一个版本的检查点数据,检查点文件不支持追加,比如本检查点周期的数据只能单独新建一个文件保存,而不能追加到上一个检查点周期的文件。
6.SCR维护一套元数据文件,将其存储在检查点文件所在目录的子目录中。应用必须给SCR足够的权限以保证SCR确实能够存储它生成的元数据文件。
7.All files must reside under a top-level directory on the parallel file system called the “prefix” directory that is specified by the application. Under that prefix directory, the application may use subdirectory trees. See Section Control, cache, and prefix directories for details.
8.应用可以对SCR进行配置,让SCR将检查点数据缓存在RAM disk中。应用必须自己确保内存是足够的。所需缓存的大小取决于几个因素:缓存多少个检查点版本、采用何种冗余机制(缓存在内存中毕竟不安全?)
9.必须给SCR足够的时间,让SCR保证资源即将回收时,已经缓存中的数据刷新到PFS上。