Support shared large runs with limited number of files per directory by creating one directory for a bunch of files.
Therefore, it uses the -I argument (number of files per directory) and divides it by -n (items). This will be a number of sub directories that are created on the top-level.master
parent
580fb8cdf7
commit
0870ad78b3
399
src/mdtest.c
399
src/mdtest.c
|
@ -83,7 +83,6 @@ static int size;
|
||||||
static uint64_t *rand_array;
|
static uint64_t *rand_array;
|
||||||
static char testdir[MAX_PATHLEN];
|
static char testdir[MAX_PATHLEN];
|
||||||
static char testdirpath[MAX_PATHLEN];
|
static char testdirpath[MAX_PATHLEN];
|
||||||
static char top_dir[MAX_PATHLEN];
|
|
||||||
static char base_tree_name[MAX_PATHLEN];
|
static char base_tree_name[MAX_PATHLEN];
|
||||||
static char **filenames;
|
static char **filenames;
|
||||||
static char hostname[MAX_PATHLEN];
|
static char hostname[MAX_PATHLEN];
|
||||||
|
@ -125,6 +124,7 @@ static uint64_t num_dirs_in_tree;
|
||||||
*/
|
*/
|
||||||
static uint64_t items;
|
static uint64_t items;
|
||||||
static uint64_t items_per_dir;
|
static uint64_t items_per_dir;
|
||||||
|
static int directory_loops;
|
||||||
static int print_time;
|
static int print_time;
|
||||||
static int random_seed;
|
static int random_seed;
|
||||||
static int shared_file;
|
static int shared_file;
|
||||||
|
@ -219,6 +219,15 @@ void parse_dirpath(char *dirpath_arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prep_testdir(int j, int dir_iter){
|
||||||
|
int pos = sprintf(testdir, "%s", testdirpath);
|
||||||
|
if ( testdir[strlen( testdir ) - 1] != '/' ) {
|
||||||
|
pos += sprintf(& testdir[pos], "/");
|
||||||
|
}
|
||||||
|
pos += sprintf(& testdir[pos], "%s", TEST_DIR);
|
||||||
|
pos += sprintf(& testdir[pos], ".%d-%d", j, dir_iter);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function copies the unique directory name for a given option to
|
* This function copies the unique directory name for a given option to
|
||||||
* the "to" parameter. Some memory must be allocated to the "to" parameter.
|
* the "to" parameter. Some memory must be allocated to the "to" parameter.
|
||||||
|
@ -232,15 +241,15 @@ void unique_dir_access(int opt, char *to) {
|
||||||
|
|
||||||
if (opt == MK_UNI_DIR) {
|
if (opt == MK_UNI_DIR) {
|
||||||
MPI_Barrier(testComm);
|
MPI_Barrier(testComm);
|
||||||
strcpy( to, unique_chdir_dir );
|
sprintf( to, "%s/%s", testdir, unique_chdir_dir );
|
||||||
} else if (opt == STAT_SUB_DIR) {
|
} else if (opt == STAT_SUB_DIR) {
|
||||||
strcpy( to, unique_stat_dir );
|
sprintf( to, "%s/%s", testdir, unique_stat_dir );
|
||||||
} else if (opt == READ_SUB_DIR) {
|
} else if (opt == READ_SUB_DIR) {
|
||||||
strcpy( to, unique_read_dir );
|
sprintf( to, "%s/%s", testdir, unique_read_dir );
|
||||||
} else if (opt == RM_SUB_DIR) {
|
} else if (opt == RM_SUB_DIR) {
|
||||||
strcpy( to, unique_rm_dir );
|
sprintf( to, "%s/%s", testdir, unique_rm_dir );
|
||||||
} else if (opt == RM_UNI_DIR) {
|
} else if (opt == RM_UNI_DIR) {
|
||||||
strcpy( to, unique_rm_uni_dir );
|
sprintf( to, "%s/%s", testdir, unique_rm_uni_dir );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -525,7 +534,7 @@ void create_remove_items(int currDepth, const int dirs, const int create, const
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stats all of the items created as specified by the input parameters */
|
/* stats all of the items created as specified by the input parameters */
|
||||||
void mdtest_stat(const int random, const int dirs, const char *path, rank_progress_t * progress) {
|
void mdtest_stat(const int random, const int dirs, const long dir_iter, const char *path, rank_progress_t * progress) {
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
uint64_t parent_dir, item_num = 0;
|
uint64_t parent_dir, item_num = 0;
|
||||||
char item[MAX_PATHLEN], temp[MAX_PATHLEN];
|
char item[MAX_PATHLEN], temp[MAX_PATHLEN];
|
||||||
|
@ -535,8 +544,14 @@ void mdtest_stat(const int random, const int dirs, const char *path, rank_progre
|
||||||
fflush( out_logfile );
|
fflush( out_logfile );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t stop_items = items;
|
||||||
|
|
||||||
|
if( directory_loops != 1 ){
|
||||||
|
stop_items = items_per_dir;
|
||||||
|
}
|
||||||
|
|
||||||
/* iterate over all of the item IDs */
|
/* iterate over all of the item IDs */
|
||||||
for (uint64_t i = 0 ; i < items ; ++i) {
|
for (uint64_t i = 0 ; i < stop_items ; ++i) {
|
||||||
/*
|
/*
|
||||||
* It doesn't make sense to pass the address of the array because that would
|
* It doesn't make sense to pass the address of the array because that would
|
||||||
* be like passing char **. Tested it on a Cray and it seems to work either
|
* be like passing char **. Tested it on a Cray and it seems to work either
|
||||||
|
@ -547,6 +562,7 @@ void mdtest_stat(const int random, const int dirs, const char *path, rank_progre
|
||||||
memset(item, 0, MAX_PATHLEN);
|
memset(item, 0, MAX_PATHLEN);
|
||||||
memset(temp, 0, MAX_PATHLEN);
|
memset(temp, 0, MAX_PATHLEN);
|
||||||
|
|
||||||
|
|
||||||
/* determine the item number to stat */
|
/* determine the item number to stat */
|
||||||
if (random) {
|
if (random) {
|
||||||
item_num = rand_array[i];
|
item_num = rand_array[i];
|
||||||
|
@ -626,7 +642,7 @@ void mdtest_stat(const int random, const int dirs, const char *path, rank_progre
|
||||||
|
|
||||||
|
|
||||||
/* reads all of the items created as specified by the input parameters */
|
/* reads all of the items created as specified by the input parameters */
|
||||||
void mdtest_read(int random, int dirs, char *path) {
|
void mdtest_read(int random, int dirs, const long dir_iter, char *path) {
|
||||||
uint64_t parent_dir, item_num = 0;
|
uint64_t parent_dir, item_num = 0;
|
||||||
char item[MAX_PATHLEN], temp[MAX_PATHLEN];
|
char item[MAX_PATHLEN], temp[MAX_PATHLEN];
|
||||||
void *aiori_fh;
|
void *aiori_fh;
|
||||||
|
@ -644,8 +660,14 @@ void mdtest_read(int random, int dirs, char *path) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t stop_items = items;
|
||||||
|
|
||||||
|
if( directory_loops != 1 ){
|
||||||
|
stop_items = items_per_dir;
|
||||||
|
}
|
||||||
|
|
||||||
/* iterate over all of the item IDs */
|
/* iterate over all of the item IDs */
|
||||||
for (uint64_t i = 0 ; i < items ; ++i) {
|
for (uint64_t i = 0 ; i < stop_items ; ++i) {
|
||||||
/*
|
/*
|
||||||
* It doesn't make sense to pass the address of the array because that would
|
* It doesn't make sense to pass the address of the array because that would
|
||||||
* be like passing char **. Tested it on a Cray and it seems to work either
|
* be like passing char **. Tested it on a Cray and it seems to work either
|
||||||
|
@ -830,13 +852,15 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
|
|
||||||
/* create phase */
|
/* create phase */
|
||||||
if(create_only) {
|
if(create_only) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(MK_UNI_DIR, temp_path);
|
unique_dir_access(MK_UNI_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 0);
|
offset_timers(t, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -853,6 +877,7 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
/* create directories */
|
/* create directories */
|
||||||
create_remove_items(0, 1, 1, 0, temp_path, 0, progress);
|
create_remove_items(0, 1, 1, 0, temp_path, 0, progress);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -862,13 +887,15 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
|
|
||||||
/* stat phase */
|
/* stat phase */
|
||||||
if (stat_only) {
|
if (stat_only) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(STAT_SUB_DIR, temp_path);
|
unique_dir_access(STAT_SUB_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 1);
|
offset_timers(t, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -878,10 +905,11 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
|
|
||||||
/* stat directories */
|
/* stat directories */
|
||||||
if (random_seed > 0) {
|
if (random_seed > 0) {
|
||||||
mdtest_stat(1, 1, temp_path, progress);
|
mdtest_stat(1, 1, dir_iter, temp_path, progress);
|
||||||
} else {
|
} else {
|
||||||
mdtest_stat(0, 1, temp_path, progress);
|
mdtest_stat(0, 1, dir_iter, temp_path, progress);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -891,13 +919,15 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
|
|
||||||
/* read phase */
|
/* read phase */
|
||||||
if (read_only) {
|
if (read_only) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(READ_SUB_DIR, temp_path);
|
unique_dir_access(READ_SUB_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 2);
|
offset_timers(t, 2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -911,6 +941,7 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
} else {
|
} else {
|
||||||
; /* N/A */
|
; /* N/A */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -919,13 +950,15 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
t[3] = MPI_Wtime();
|
t[3] = MPI_Wtime();
|
||||||
|
|
||||||
if (remove_only) {
|
if (remove_only) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(RM_SUB_DIR, temp_path);
|
unique_dir_access(RM_SUB_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 3);
|
offset_timers(t, 3);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -941,6 +974,7 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
} else {
|
} else {
|
||||||
create_remove_items(0, 1, 0, 0, temp_path, 0, progress);
|
create_remove_items(0, 1, 0, 0, temp_path, 0, progress);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -952,7 +986,7 @@ void directory_test(const int iteration, const int ntasks, const char *path, ran
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(RM_UNI_DIR, temp_path);
|
unique_dir_access(RM_UNI_DIR, temp_path);
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -1055,13 +1089,16 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
|
|
||||||
/* create phase */
|
/* create phase */
|
||||||
if (create_only ) {
|
if (create_only ) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
|
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(MK_UNI_DIR, temp_path);
|
unique_dir_access(MK_UNI_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 0);
|
offset_timers(t, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -1093,6 +1130,7 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
StoreStoneWallingIterations(stoneWallingStatusFile, progress->items_done);
|
StoreStoneWallingIterations(stoneWallingStatusFile, progress->items_done);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
if (stoneWallingStatusFile){
|
if (stoneWallingStatusFile){
|
||||||
int64_t expected_items;
|
int64_t expected_items;
|
||||||
|
@ -1119,13 +1157,15 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
|
|
||||||
/* stat phase */
|
/* stat phase */
|
||||||
if (stat_only ) {
|
if (stat_only ) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(STAT_SUB_DIR, temp_path);
|
unique_dir_access(STAT_SUB_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 1);
|
offset_timers(t, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -1134,7 +1174,8 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stat files */
|
/* stat files */
|
||||||
mdtest_stat((random_seed > 0 ? 1 : 0), 0, temp_path, progress);
|
mdtest_stat((random_seed > 0 ? 1 : 0), 0, dir_iter, temp_path, progress);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -1144,13 +1185,15 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
|
|
||||||
/* read phase */
|
/* read phase */
|
||||||
if (read_only ) {
|
if (read_only ) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(READ_SUB_DIR, temp_path);
|
unique_dir_access(READ_SUB_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 2);
|
offset_timers(t, 2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -1160,10 +1203,11 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
|
|
||||||
/* read files */
|
/* read files */
|
||||||
if (random_seed > 0) {
|
if (random_seed > 0) {
|
||||||
mdtest_read(1,0,temp_path);
|
mdtest_read(1,0, dir_iter, temp_path);
|
||||||
} else {
|
} else {
|
||||||
mdtest_read(0,0,temp_path);
|
mdtest_read(0,0, dir_iter, temp_path);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -1172,13 +1216,15 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
t[3] = MPI_Wtime();
|
t[3] = MPI_Wtime();
|
||||||
|
|
||||||
if (remove_only) {
|
if (remove_only) {
|
||||||
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
|
prep_testdir(iteration, dir_iter);
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
unique_dir_access(RM_SUB_DIR, temp_path);
|
unique_dir_access(RM_SUB_DIR, temp_path);
|
||||||
if (!time_unique_dir_overhead) {
|
if (!time_unique_dir_overhead) {
|
||||||
offset_timers(t, 3);
|
offset_timers(t, 3);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy( temp_path, path );
|
sprintf( temp_path, "%s/%s", testdir, path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -1193,6 +1239,7 @@ void file_test(const int iteration, const int ntasks, const char *path, rank_pro
|
||||||
} else {
|
} else {
|
||||||
create_remove_items(0, 0, 0, 0, temp_path, 0, progress);
|
create_remove_items(0, 0, 0, 0, temp_path, 0, progress);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barriers) {
|
if (barriers) {
|
||||||
|
@ -1599,7 +1646,13 @@ void valid_tests() {
|
||||||
}
|
}
|
||||||
/* check for valid number of items */
|
/* check for valid number of items */
|
||||||
if ((items > 0) && (items_per_dir > 0)) {
|
if ((items > 0) && (items_per_dir > 0)) {
|
||||||
FAIL("only specify the number of items or the number of items per directory");
|
if(unique_dir_per_task){
|
||||||
|
FAIL("only specify the number of items or the number of items per directory");
|
||||||
|
}else if( items % items_per_dir != 0){
|
||||||
|
FAIL("items must be a multiple of items per directory");
|
||||||
|
}else if( stone_wall_timer_seconds != 0){
|
||||||
|
FAIL("items + items_per_dir can only be set without stonewalling");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1738,7 +1791,7 @@ void create_remove_directory_tree(int create,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-1 == backend->mkdir (dir, DIRMODE, ¶m)) {
|
if (-1 == backend->mkdir (dir, DIRMODE, ¶m)) {
|
||||||
//FAIL("Unable to create directory");
|
fprintf(out_logfile, "error could not create directory \"%s\"\n", dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1813,82 +1866,84 @@ static void mdtest_iteration(int i, int j, MPI_Group testgroup, mdtest_results_t
|
||||||
fflush(out_logfile);
|
fflush(out_logfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
int pos = sprintf(testdir, "%s", testdirpath);
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
if ( testdir[strlen( testdir ) - 1] != '/' ) {
|
prep_testdir(j, dir_iter);
|
||||||
pos += sprintf(& testdir[pos], "/");
|
|
||||||
}
|
|
||||||
pos += sprintf(& testdir[pos], "%s", TEST_DIR);
|
|
||||||
pos += sprintf(& testdir[pos], ".%d", j);
|
|
||||||
|
|
||||||
if (verbose >= 2 && rank == 0) {
|
if (verbose >= 2 && rank == 0) {
|
||||||
fprintf(out_logfile, "V-2: main (for j loop): making testdir, \"%s\"\n", testdir );
|
fprintf(out_logfile, "V-2: main (for j loop): making testdir, \"%s\"\n", testdir );
|
||||||
fflush( out_logfile );
|
fflush( out_logfile );
|
||||||
}
|
}
|
||||||
if ((rank < path_count) && backend->access(testdir, F_OK, ¶m) != 0) {
|
if ((rank < path_count) && backend->access(testdir, F_OK, ¶m) != 0) {
|
||||||
if (backend->mkdir(testdir, DIRMODE, ¶m) != 0) {
|
if (backend->mkdir(testdir, DIRMODE, ¶m) != 0) {
|
||||||
FAIL("Unable to create test directory");
|
FAIL("Unable to create test directory");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create hierarchical directory structure */
|
|
||||||
MPI_Barrier(testComm);
|
|
||||||
if (create_only) {
|
if (create_only) {
|
||||||
|
/* create hierarchical directory structure */
|
||||||
|
MPI_Barrier(testComm);
|
||||||
|
|
||||||
startCreate = MPI_Wtime();
|
startCreate = MPI_Wtime();
|
||||||
if (unique_dir_per_task) {
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
if (collective_creates && (rank == 0)) {
|
prep_testdir(j, dir_iter);
|
||||||
/*
|
|
||||||
* This is inside two loops, one of which already uses "i" and the other uses "j".
|
|
||||||
* I don't know how this ever worked. I'm changing this loop to use "k".
|
|
||||||
*/
|
|
||||||
for (k=0; k<size; k++) {
|
|
||||||
sprintf(base_tree_name, "mdtest_tree.%d", k);
|
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (unique_dir_per_task) {
|
||||||
fprintf(out_logfile,
|
if (collective_creates && (rank == 0)) {
|
||||||
"V-3: main (create hierarchical directory loop-collective): Calling create_remove_directory_tree with \"%s\"\n",
|
/*
|
||||||
testdir );
|
* This is inside two loops, one of which already uses "i" and the other uses "j".
|
||||||
fflush( out_logfile );
|
* I don't know how this ever worked. I'm changing this loop to use "k".
|
||||||
}
|
*/
|
||||||
|
for (k=0; k<size; k++) {
|
||||||
|
sprintf(base_tree_name, "mdtest_tree.%d", k);
|
||||||
|
|
||||||
/*
|
if (verbose >= 3 && rank == 0) {
|
||||||
* Let's pass in the path to the directory we most recently made so that we can use
|
fprintf(out_logfile,
|
||||||
* full paths in the other calls.
|
"V-3: main (create hierarchical directory loop-collective): Calling create_remove_directory_tree with \"%s\"\n",
|
||||||
*/
|
testdir );
|
||||||
create_remove_directory_tree(1, 0, testdir, 0, progress);
|
fflush( out_logfile );
|
||||||
if(CHECK_STONE_WALL(progress)){
|
}
|
||||||
size = k;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!collective_creates) {
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
|
||||||
fprintf(out_logfile,
|
|
||||||
"V-3: main (create hierarchical directory loop-!collective_creates): Calling create_remove_directory_tree with \"%s\"\n",
|
|
||||||
testdir );
|
|
||||||
fflush( out_logfile );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's pass in the path to the directory we most recently made so that we can use
|
* Let's pass in the path to the directory we most recently made so that we can use
|
||||||
* full paths in the other calls.
|
* full paths in the other calls.
|
||||||
*/
|
*/
|
||||||
create_remove_directory_tree(1, 0, testdir, 0, progress);
|
create_remove_directory_tree(1, 0, testdir, 0, progress);
|
||||||
}
|
if(CHECK_STONE_WALL(progress)){
|
||||||
} else {
|
size = k;
|
||||||
if (rank == 0) {
|
break;
|
||||||
if (verbose >= 3 && rank == 0) {
|
}
|
||||||
fprintf(out_logfile,
|
}
|
||||||
"V-3: main (create hierarchical directory loop-!unque_dir_per_task): Calling create_remove_directory_tree with \"%s\"\n",
|
} else if (!collective_creates) {
|
||||||
testdir );
|
if (verbose >= 3 && rank == 0) {
|
||||||
fflush( out_logfile );
|
fprintf(out_logfile,
|
||||||
}
|
"V-3: main (create hierarchical directory loop-!collective_creates): Calling create_remove_directory_tree with \"%s\"\n",
|
||||||
|
testdir );
|
||||||
|
fflush( out_logfile );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's pass in the path to the directory we most recently made so that we can use
|
* Let's pass in the path to the directory we most recently made so that we can use
|
||||||
* full paths in the other calls.
|
* full paths in the other calls.
|
||||||
*/
|
*/
|
||||||
create_remove_directory_tree(1, 0 , testdir, 0, progress);
|
create_remove_directory_tree(1, 0, testdir, 0, progress);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (rank == 0) {
|
||||||
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
fprintf(out_logfile,
|
||||||
|
"V-3: main (create hierarchical directory loop-!unque_dir_per_task): Calling create_remove_directory_tree with \"%s\"\n",
|
||||||
|
testdir );
|
||||||
|
fflush( out_logfile );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Let's pass in the path to the directory we most recently made so that we can use
|
||||||
|
* full paths in the other calls.
|
||||||
|
*/
|
||||||
|
create_remove_directory_tree(1, 0 , testdir, 0, progress);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
MPI_Barrier(testComm);
|
MPI_Barrier(testComm);
|
||||||
endCreate = MPI_Wtime();
|
endCreate = MPI_Wtime();
|
||||||
|
@ -1903,12 +1958,12 @@ static void mdtest_iteration(int i, int j, MPI_Group testgroup, mdtest_results_t
|
||||||
fflush(out_logfile);
|
fflush(out_logfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sprintf(unique_mk_dir, "%s/%s.0", testdir, base_tree_name);
|
sprintf(unique_mk_dir, "%s.0", base_tree_name);
|
||||||
sprintf(unique_chdir_dir, "%s/%s.0", testdir, base_tree_name);
|
sprintf(unique_chdir_dir, "%s.0", base_tree_name);
|
||||||
sprintf(unique_stat_dir, "%s/%s.0", testdir, base_tree_name);
|
sprintf(unique_stat_dir, "%s.0", base_tree_name);
|
||||||
sprintf(unique_read_dir, "%s/%s.0", testdir, base_tree_name);
|
sprintf(unique_read_dir, "%s.0", base_tree_name);
|
||||||
sprintf(unique_rm_dir, "%s/%s.0", testdir, base_tree_name);
|
sprintf(unique_rm_dir, "%s.0", base_tree_name);
|
||||||
sprintf(unique_rm_uni_dir, "%s", testdir);
|
unique_rm_uni_dir[0] = 0;
|
||||||
|
|
||||||
if (!unique_dir_per_task) {
|
if (!unique_dir_per_task) {
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
|
@ -1925,19 +1980,13 @@ static void mdtest_iteration(int i, int j, MPI_Group testgroup, mdtest_results_t
|
||||||
sprintf(rm_name, "mdtest.%d.", (rank+(3*nstride))%i);
|
sprintf(rm_name, "mdtest.%d.", (rank+(3*nstride))%i);
|
||||||
}
|
}
|
||||||
if (unique_dir_per_task) {
|
if (unique_dir_per_task) {
|
||||||
sprintf(unique_mk_dir, "%s/mdtest_tree.%d.0", testdir,
|
sprintf(unique_mk_dir, "mdtest_tree.%d.0", (rank+(0*nstride))%i);
|
||||||
(rank+(0*nstride))%i);
|
sprintf(unique_chdir_dir, "mdtest_tree.%d.0", (rank+(1*nstride))%i);
|
||||||
sprintf(unique_chdir_dir, "%s/mdtest_tree.%d.0", testdir,
|
sprintf(unique_stat_dir, "mdtest_tree.%d.0", (rank+(2*nstride))%i);
|
||||||
(rank+(1*nstride))%i);
|
sprintf(unique_read_dir, "mdtest_tree.%d.0", (rank+(3*nstride))%i);
|
||||||
sprintf(unique_stat_dir, "%s/mdtest_tree.%d.0", testdir,
|
sprintf(unique_rm_dir, "mdtest_tree.%d.0", (rank+(4*nstride))%i);
|
||||||
(rank+(2*nstride))%i);
|
unique_rm_uni_dir[0] = 0;
|
||||||
sprintf(unique_read_dir, "%s/mdtest_tree.%d.0", testdir,
|
|
||||||
(rank+(3*nstride))%i);
|
|
||||||
sprintf(unique_rm_dir, "%s/mdtest_tree.%d.0", testdir,
|
|
||||||
(rank+(4*nstride))%i);
|
|
||||||
sprintf(unique_rm_uni_dir, "%s", testdir);
|
|
||||||
}
|
}
|
||||||
strcpy(top_dir, unique_mk_dir);
|
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
fprintf(out_logfile, "V-3: main: Copied unique_mk_dir, \"%s\", to topdir\n", unique_mk_dir );
|
fprintf(out_logfile, "V-3: main: Copied unique_mk_dir, \"%s\", to topdir\n", unique_mk_dir );
|
||||||
|
@ -1969,61 +2018,64 @@ static void mdtest_iteration(int i, int j, MPI_Group testgroup, mdtest_results_t
|
||||||
MPI_Barrier(testComm);
|
MPI_Barrier(testComm);
|
||||||
if (remove_only) {
|
if (remove_only) {
|
||||||
startCreate = MPI_Wtime();
|
startCreate = MPI_Wtime();
|
||||||
if (unique_dir_per_task) {
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
if (collective_creates && (rank == 0)) {
|
prep_testdir(j, dir_iter);
|
||||||
/*
|
if (unique_dir_per_task) {
|
||||||
* This is inside two loops, one of which already uses "i" and the other uses "j".
|
if (collective_creates && (rank == 0)) {
|
||||||
* I don't know how this ever worked. I'm changing this loop to use "k".
|
/*
|
||||||
*/
|
* This is inside two loops, one of which already uses "i" and the other uses "j".
|
||||||
for (k=0; k<size; k++) {
|
* I don't know how this ever worked. I'm changing this loop to use "k".
|
||||||
sprintf(base_tree_name, "mdtest_tree.%d", k);
|
*/
|
||||||
|
for (k=0; k<size; k++) {
|
||||||
|
sprintf(base_tree_name, "mdtest_tree.%d", k);
|
||||||
|
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
fprintf(out_logfile,
|
fprintf(out_logfile,
|
||||||
"V-3: main (remove hierarchical directory loop-collective): Calling create_remove_directory_tree with \"%s\"\n",
|
"V-3: main (remove hierarchical directory loop-collective): Calling create_remove_directory_tree with \"%s\"\n",
|
||||||
testdir );
|
testdir );
|
||||||
fflush( out_logfile );
|
fflush( out_logfile );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's pass in the path to the directory we most recently made so that we can use
|
* Let's pass in the path to the directory we most recently made so that we can use
|
||||||
* full paths in the other calls.
|
* full paths in the other calls.
|
||||||
*/
|
*/
|
||||||
create_remove_directory_tree(0, 0, testdir, 0, progress);
|
create_remove_directory_tree(0, 0, testdir, 0, progress);
|
||||||
if(CHECK_STONE_WALL(progress)){
|
if(CHECK_STONE_WALL(progress)){
|
||||||
size = k;
|
size = k;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!collective_creates) {
|
} else if (!collective_creates) {
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
fprintf(out_logfile,
|
fprintf(out_logfile,
|
||||||
"V-3: main (remove hierarchical directory loop-!collective): Calling create_remove_directory_tree with \"%s\"\n",
|
"V-3: main (remove hierarchical directory loop-!collective): Calling create_remove_directory_tree with \"%s\"\n",
|
||||||
testdir );
|
testdir );
|
||||||
fflush( out_logfile );
|
fflush( out_logfile );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's pass in the path to the directory we most recently made so that we can use
|
* Let's pass in the path to the directory we most recently made so that we can use
|
||||||
* full paths in the other calls.
|
* full paths in the other calls.
|
||||||
*/
|
*/
|
||||||
create_remove_directory_tree(0, 0, testdir, 0, progress);
|
create_remove_directory_tree(0, 0, testdir, 0, progress);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (rank == 0) {
|
if (rank == 0) {
|
||||||
if (verbose >= 3 && rank == 0) {
|
if (verbose >= 3 && rank == 0) {
|
||||||
fprintf(out_logfile,
|
fprintf(out_logfile,
|
||||||
"V-3: main (remove hierarchical directory loop-!unique_dir_per_task): Calling create_remove_directory_tree with \"%s\"\n",
|
"V-3: main (remove hierarchical directory loop-!unique_dir_per_task): Calling create_remove_directory_tree with \"%s\"\n",
|
||||||
testdir );
|
testdir );
|
||||||
fflush( out_logfile );
|
fflush( out_logfile );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's pass in the path to the directory we most recently made so that we can use
|
* Let's pass in the path to the directory we most recently made so that we can use
|
||||||
* full paths in the other calls.
|
* full paths in the other calls.
|
||||||
*/
|
*/
|
||||||
create_remove_directory_tree(0, 0 , testdir, 0, progress);
|
create_remove_directory_tree(0, 0 , testdir, 0, progress);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Barrier(testComm);
|
MPI_Barrier(testComm);
|
||||||
|
@ -2043,11 +2095,14 @@ static void mdtest_iteration(int i, int j, MPI_Group testgroup, mdtest_results_t
|
||||||
fflush( out_logfile );
|
fflush( out_logfile );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rank < path_count) && backend->access(testdir, F_OK, ¶m) == 0) {
|
for (int dir_iter = 0; dir_iter < directory_loops; dir_iter ++){
|
||||||
//if (( rank == 0 ) && access(testdir, F_OK) == 0) {
|
prep_testdir(j, dir_iter);
|
||||||
if (backend->rmdir(testdir, ¶m) == -1) {
|
if ((rank < path_count) && backend->access(testdir, F_OK, ¶m) == 0) {
|
||||||
FAIL("unable to remove directory");
|
//if (( rank == 0 ) && access(testdir, F_OK) == 0) {
|
||||||
}
|
if (backend->rmdir(testdir, ¶m) == -1) {
|
||||||
|
FAIL("unable to remove directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
summary_table->rate[9] = 0;
|
summary_table->rate[9] = 0;
|
||||||
|
@ -2215,7 +2270,11 @@ mdtest_results_t * mdtest_run(int argc, char **argv, MPI_Comm world_com, FILE *
|
||||||
}
|
}
|
||||||
random_seed += rank;
|
random_seed += rank;
|
||||||
}
|
}
|
||||||
|
if ((items > 0) && (items_per_dir > 0) && (! unique_dir_per_task)) {
|
||||||
|
directory_loops = items / items_per_dir;
|
||||||
|
}else{
|
||||||
|
directory_loops = 1;
|
||||||
|
}
|
||||||
valid_tests();
|
valid_tests();
|
||||||
|
|
||||||
if (( rank == 0 ) && ( verbose >= 1 )) {
|
if (( rank == 0 ) && ( verbose >= 1 )) {
|
||||||
|
@ -2268,7 +2327,9 @@ mdtest_results_t * mdtest_run(int argc, char **argv, MPI_Comm world_com, FILE *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (items_per_dir > 0) {
|
if (items_per_dir > 0) {
|
||||||
items = items_per_dir * num_dirs_in_tree;
|
if(unique_dir_per_task){
|
||||||
|
items = items_per_dir * num_dirs_in_tree;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (leaf_only) {
|
if (leaf_only) {
|
||||||
if (branch_factor <= 1) {
|
if (branch_factor <= 1) {
|
||||||
|
|
Loading…
Reference in New Issue