int main(int argc, char **argv) { int ierr, nhits, vselect; const char *conffile; const char *logfile; FILE* output; FastBitQueryHandle qh; FastBitResultSetHandle rh; ierr = 0; vselect = 1; logfile = 0; conffile = 0; #if defined(DEBUG) || defined(_DEBUG) #if DEBUG + 0 > 10 || _DEBUG + 0 > 10 ierr = INT_MAX; #elif DEBUG + 0 > 0 ierr += 7 * DEBUG; #elif _DEBUG + 0 > 0 ierr += 5 * _DEBUG; #else ierr += 3; #endif #endif /* process arguments started with - */ while (vselect < argc && argv[vselect][0] == '-') { if (argv[vselect][1] == 'c' || argv[vselect][1] == 'C') { if (vselect+1 < argc) { conffile = argv[vselect+1]; vselect += 2; } else { vselect += 1; } } else if (argv[vselect][1] == 'h' || argv[vselect][1] == 'H') { usage(*argv); vselect += 1; } #if defined(TCAPI_USE_LOGFILE) else if (argv[vselect][1] == 'l' || argv[vselect][1] == 'L') { if (vselect+1 < argc) { logfile = argv[vselect+1]; vselect += 2; } else { vselect += 1; } } #endif else if (argv[vselect][1] == 'm' || argv[vselect][1] == 'M' || argv[vselect][1] == 'v' || argv[vselect][1] == 'V') { if (vselect+1 < argc && (isdigit(argv[vselect+1][0]) != 0 || (argv[vselect+1][0] == '-' && isdigit(argv[vselect+1][1]) != 0))) { ierr += atoi(argv[vselect+1]); vselect += 2; } else { ierr += 1; vselect += 1; } } else { fprintf(stderr, "%s: unknown option %s\n", *argv, argv[vselect]); ++ vselect; } } fastbit_init((const char*)conffile); fastbit_set_verbose_level(ierr); fastbit_set_logfile(logfile); #if defined(TCAPI_USE_LOGFILE) output = fastbit_get_logfilepointer(); printf("%s: output=0x%8.8x, stdout=0x%8.8x\n", *argv, output, stdout); #else output = stdout; #endif if (argc <= vselect) { builtin(*argv, output); return -1; } if (argc == vselect+1) /* buld indexes */ return fastbit_build_indexes(argv[vselect], (const char*)0); qh = fastbit_build_query(0, argv[vselect], argv[vselect+1]); if (qh == 0) { fprintf(output, "%s failed to process query \"%s\" on data in %s\n", argv[0], argv[vselect+1], argv[vselect]); fastbit_cleanup(); return -2; } nhits = fastbit_get_result_rows(qh); fprintf(output, "%s: applying \"%s\" on data in %s produced %d hit%s\n", argv[0], argv[vselect+1], argv[vselect], nhits, (nhits>1 ? "s" : "")); if (nhits <= 0) return 0; /* print the selected values specified in the select clause. Since the select clause was nil in the call to fastbit_build_query, there would be nothing to print here! */ rh = fastbit_build_result_set(qh); if (rh != 0) { int ncols = fastbit_get_result_columns(qh); fprintf(output, "%s\n", fastbit_get_select_clause(qh)); while (fastbit_result_set_next(rh) == 0) { int i; fprintf(output, "%s", fastbit_result_set_getString(rh, 0)); for (i = 1; i < ncols; ++ i) fprintf(output, ", %s", fastbit_result_set_getString(rh, i)); fprintf(output, "\n"); } fastbit_destroy_result_set(rh); } fflush(output); vselect += 2; /* print attributes explicitly specified on the command line */ if (argc > vselect) { int i, j; for (i = vselect; i < argc; i += 2) { char t = (i+1<argc ? argv[i+1][0] : 'i'); switch (t) { default: case 'i': case 'I': { const int32_t *tmp = fastbit_get_qualified_ints(qh, argv[i]); if (tmp != 0) { fprintf(output, "%s[%d]=", argv[i], nhits); for (j = 0; j < nhits; ++ j) fprintf(output, "%d ", (int)tmp[j]); fprintf(output, "\n"); } else { fprintf(output, "%s: failed to retrieve values for " "column %s (requested type %c)\n", argv[0], argv[i], t); } break;} case 'u': case 'U': { const uint32_t *tmp = fastbit_get_qualified_uints(qh, argv[i]); if (tmp != 0) { fprintf(output, "%s[%d]=", argv[i], nhits); for (j = 0; j < nhits; ++ j) fprintf(output, "%u ", (unsigned)tmp[j]); fprintf(output, "\n"); } else { fprintf(output, "%s: failed to retrieve value for " "column %s (requested type %c)\n", argv[0], argv[i], t); } break;} case 'l': case 'L': { const int64_t *tmp = fastbit_get_qualified_longs(qh, argv[i]); if (tmp != 0) { fprintf(output, "%s[%d]=", argv[i], nhits); for (j = 0; j < nhits; ++ j) fprintf(output, "%lld ", (long long)tmp[j]); fprintf(output, "\n"); } else { fprintf(output, "%s: failed to retrieve value for " "column %s (requested type %c)\n", argv[0], argv[i], t); } break;} case 'r': case 'R': case 'f': case 'F': { const float *tmp = fastbit_get_qualified_floats(qh, argv[i]); if (tmp != 0) { fprintf(output, "%s[%d]=", argv[i], nhits); for (j = 0; j < nhits; ++ j) fprintf(output, "%g ", tmp[j]); fprintf(output, "\n"); } else { fprintf(output, "%s: failed to retrieve value for " "column %s (requested type %c)\n", argv[0], argv[i], t); } break;} case 'd': case 'D': { const double *tmp = fastbit_get_qualified_doubles(qh, argv[i]); if (tmp != 0) { fprintf(output, "%s[%d]=", argv[i], nhits); for (j = 0; j < nhits; ++ j) fprintf(output, "%lG ", tmp[j]); fprintf(output, "\n"); } else { fprintf(output, "%s: failed to retrieve value for " "column %s (requested type %c)\n", argv[0], argv[i], t); } break;} case 's': case 'S': case 't': case 'T': { const char **tmp = fastbit_get_qualified_strings(qh, argv[i]); if (tmp != 0) { fprintf(output, "%s[%d]=", argv[i], nhits); for (j = 0; j < nhits; ++ j) fprintf(output, "\"%s\" ", tmp[j]); fprintf(output, "\n"); } else { fprintf(output, "%s: failed to retrieve value for " "column %s (requested type %c)\n", argv[0], argv[i], t); } break;} } } } ierr = fastbit_destroy_query(qh); fastbit_cleanup(); return ierr; } /* main */
void buildIndex_mpi(ADIOS_FILE* f, ADIOS_VARINFO* v, int rank, int size) { adios_inq_var_blockinfo(f, v); int i=0; int j=0; int k=0; printf("building index on variable %d, binning op=%s\n", v->varid, gBinningOption); int blockCounter = -1; FastBitDataType ft = fastbit_adios_util_getFastbitDataType(v->type); #ifdef SINGLE_BLOCK for (i=0; i < v->nsteps; i++) { int nblocks = v->nblocks[i]; for (j=0; j < nblocks; j++) { blockCounter++; if (blockCounter % size == rank) { onBlock(rank, f, v, i, j, blockCounter, ft); fastbit_cleanup(); } } printf(" rank %d, varid %d, timestep %d total index created = %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", \n", rank, v->varid, i, sum_nb, sum_nk, sum_no); printf(" rank %d, varid %d, timestep %d total bytes = %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", \n", rank, v->varid, i, adios_type_size(adios_unsigned_integer , NULL)*sum_nb, adios_type_size(adios_double, NULL)*sum_nk, adios_type_size(adios_long, NULL)*sum_no); printf("\n"); } #endif #ifdef MULTI_BLOCK for (i=0; i<v->nsteps; i++) { int nblocks = v->nblocks[i]; int blockStart = 0; int blockEnd = blockStart+pack; while (blockStart < nblocks) { if (blockEnd > nblocks) { blockEnd = nblocks; } printf("block start=%d, end=%d, max=%d\n", blockStart, blockEnd, nblocks); if (workCounter % size == rank) { printf("%ld mod %ld == %d \n", workCounter, size, rank); onMultiBlock(rank, f, v, i, blockStart, blockEnd, ft); fastbit_cleanup(); } workCounter ++; blockStart += pack; blockEnd = blockStart+pack; } fastbit_cleanup(); } #endif #ifdef BOX for (i=0; i<v->nsteps; i++) { uint64_t s = 0; uint64_t dataSize = 1; uint64_t start[v->ndim]; for (s=0; s<v->ndim; s++) { dataSize *= v->dims[s]; start[s] = 0; } uint64_t split = dataSize/recommended_index_ele; uint64_t startRef = 0; if (split == 0) { if (rank == 0) { onBox(rank, f, v, i, start, v->dims, ft); } } else { while (startRef < v->dims[0]) { uint64_t count[v->ndim]; start[0] = startRef; startRef += v->dims[0]/split; if (startRef >= v->dims[0]) { startRef = v->dims[0]; } count[0] = startRef - start[0]; for (s=1; s<v->ndim; s++) { start[s] = 0; count[s] = v->dims[s]; } if (workCounter % size == rank) { onBox(rank, f, v, i, start, count, ft); } workCounter ++; } } } #endif }
int main (int argc, char** argv) { fastbit_init(0); fastbit_set_verbose_level(0); ADIOS_FILE * f; //MPI_Comm comm_dummy = 0; // MPI_Comm is defined through adios_read.h MPI_Comm comm_dummy = MPI_COMM_WORLD; int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (comm_dummy, &rank); MPI_Comm_size (comm_dummy, &size); adios_init_noxml (comm_dummy); if (argc < 2) { printf("Usage: index_fastbit fileName (attrName)"); return 0; } f = adios_read_open_file (argv[1], ADIOS_READ_METHOD_BP, comm_dummy); if (f == NULL) { printf ("::%s\n", adios_errmsg()); return -1; } /* adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, (f->file_size)*2/1048576 + 5); // +5MB for extra room in buffer adios_declare_group (&gAdios_group, gGroupNameFastbitIdx, "", adios_flag_yes); adios_select_method (gAdios_group, "MPI", "", ""); */ gIdxFileName = fastbit_adios_util_getFastbitIndexFileName(argv[1]); unlink(gIdxFileName); adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 500); // +5MB for extra room in buffer adios_declare_group (&gAdios_group, gGroupNameFastbitIdx, "", adios_flag_yes); adios_select_method (gAdios_group, "MPI", "", ""); adios_open (&gAdios_write_file, gGroupNameFastbitIdx, gIdxFileName, "w", MPI_COMM_WORLD); #ifdef MULTI_BLOCK int testid = adios_define_var (gAdios_group, "pack", "", adios_integer , 0, 0, 0); #endif #ifdef BOX int testid = adios_define_var (gAdios_group, "elements", "", adios_integer , 0, 0, 0); #endif //uint64_t estimatedbytes = (nb+nk+no)*adios_type_size(adios_double, NULL); int jobCounter = getJobCounter(f); uint64_t estimatedbytes = getByteEstimationOnFile(f, rank); if (size > 1) { int maxJobsPP = jobCounter/size + 1; estimatedbytes = estimatedbytes * maxJobsPP /jobCounter +1048576; } estimatedbytes += 1048576; uint64_t adios_totalsize; // adios_group_size needs to be call before any write_byid, Otherwise write_byid does nothing adios_group_size (gAdios_write_file, estimatedbytes , &adios_totalsize); printf("=> .. adios open output file: %s, rank %d allocated %" PRIu64 " bytes... \n", gIdxFileName, rank, adios_totalsize); // IMPORTANT: // can only call open/close once in a process // otherwise data is tangled or only the data in the last open/close call is recorded #ifdef MULTI_BLOCK adios_write_byid(gAdios_write_file, testid, &pack); #endif #ifdef BOX adios_write_byid(gAdios_write_file, testid, &recommended_index_ele); #endif sumLogTime(-1); sumLogTimeMillis(-1); if (argc >= 3) { int i=2; while (i<argc) { const char* varName = argv[i]; if(strstr(varName, "<binning prec") != NULL) { if (gBinningOption == NULL) { gBinningOption = argv[i]; } if (argc == 3) { buildIndexOnAllVar(f, rank, size); break; } i++; continue; } else { ADIOS_VARINFO * v = adios_inq_var(f, varName); if (v == NULL) { printf("No such variable: %s\n", varName); return 0; } printf("building fastbit index on variable: %s\n", varName); buildIndex_mpi(f, v, rank, size); adios_free_varinfo(v); i++; } } } else { buildIndexOnAllVar(f, rank, size); } sumLogTime(0); sumLogTimeMillis(0); adios_close(gAdios_write_file); adios_read_close(f); // // writing file clean up // // read back: f = adios_read_open_file (gIdxFileName, ADIOS_READ_METHOD_BP, comm_dummy); if (f == NULL) { printf("No such file: %s \n", gIdxFileName); return 0; } int numVars = f->nvars; int i=0; int k=0; int j=0; for (i=0; i<numVars; i++) { char* varName = f->var_namelist[i]; ADIOS_VARINFO* v = adios_inq_var(f, varName); adios_inq_var_blockinfo(f,v); int timestep = 0; for (k=0; k<v->sum_nblocks; k++) { verifyData(f, v, k, timestep); } adios_free_varinfo(v); } adios_read_close(f); if (rank == 0) { printf(" ==> index file is at: %s\n", gIdxFileName); } // clean up MPI_Barrier (comm_dummy); adios_finalize (rank); MPI_Finalize (); free (gIdxFileName); fastbit_cleanup(); return 0; }
JNIEXPORT void JNICALL Java_gov_lbl_fastbit_FastBit_cleanup (JNIEnv * env, jobject jo) { fastbit_cleanup(); } /* Java_gov_lbl_fastbit_FastBit_cleanup */