diff --git a/GNUmakefile b/GNUmakefile index 3182a7d0bcabe0a6e3e13da2dc25719f649c7e8d..cbc419922850707850f01331c099c7f24c41d969 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -59,7 +59,7 @@ BLOSC_CPPFLAGS := \ -Ithirdparty/blosc/internal-complibs/zstd-0.7.4/dictBuilder \ -Ithirdparty/blosc/internal-complibs/zstd-0.7.4/decompress -BASE_CPPFLAGS := $(BLOSC_CPPFLAGS) -D__STDC_CONSTANT_MACROS +BASE_CPPFLAGS := $(BLOSC_CPPFLAGS) -I. -D__STDC_CONSTANT_MACROS FEDIR = frontend FE_CFLAGS := -g -fPIC -O3 -fopenmp @@ -141,7 +141,14 @@ FE_SHARED := -bundle else FE_SHARED := -shared endif -$(FEDIR)/GenericIOSQLite.so: $(FEDIR)/GenericIOSQLite.o $(FEDIR)/GenericIO.o + +$(FEDIR)/libpygio.so: $(FEDIR)/GenericIO.o $(FEDIR)/python/lib/gio.o $(FE_BLOSC_O) + $(CXX) $(FE_CFLAGS) $(FE_SHARED) -o $@ $^ + +$(FEDIR)/gio.py: python/gio.py + cp -f $< $@ + +$(FEDIR)/GenericIOSQLite.so: $(FEDIR)/GenericIOSQLite.o $(FEDIR)/GenericIO.o $(FE_BLOSC_O) $(CXX) $(FE_CFLAGS) $(FE_SHARED) -o $@ $^ SQLITE_CPPFLAGS := -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_DISABLE_DIRSYNC=1 -DSQLITE_ENABLE_FTS3=3 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DHAVE_READLINE=1 @@ -183,7 +190,7 @@ $(MPIDIR)/GenericIOBenchmarkWrite: $(MPIDIR)/GenericIOBenchmarkWrite.o $(MPIDIR) $(MPIDIR)/GenericIORewrite: $(MPIDIR)/GenericIORewrite.o $(MPIDIR)/GenericIO.o $(MPI_BLOSC_O) $(MPICXX) $(MPI_CFLAGS) -o $@ $^ -frontend-progs: $(FEDIR)/GenericIOPrint $(FEDIR)/GenericIOVerify +frontend-progs: $(FEDIR)/GenericIOPrint $(FEDIR)/GenericIOVerify $(FEDIR)/libpygio.so $(FEDIR)/gio.py fe-progs: frontend-progs mpi-progs: $(MPIDIR)/GenericIOPrint $(MPIDIR)/GenericIOVerify $(MPIDIR)/GenericIOBenchmarkRead $(MPIDIR)/GenericIOBenchmarkWrite $(MPIDIR)/GenericIORewrite diff --git a/python/gio.py b/python/gio.py new file mode 100644 index 0000000000000000000000000000000000000000..3125d299ba819c3aa6c6e19662c7c97904b49480 --- /dev/null +++ b/python/gio.py @@ -0,0 +1,101 @@ +# Copyright (C) 2015, UChicago Argonne, LLC +# All Rights Reserved +# +# Generic IO (ANL-15-066) +# Hal Finkel, Argonne National Laboratory +# +# OPEN SOURCE LICENSE +# +# Under the terms of Contract No. DE-AC02-06CH11357 with UChicago Argonne, +# LLC, the U.S. Government retains certain rights in this software. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the names of UChicago Argonne, LLC or the Department of Energy +# nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# ***************************************************************************** +# +# DISCLAIMER +# THE SOFTWARE IS SUPPLIED “AS IS†WITHOUT WARRANTY OF ANY KIND. NEITHER THE +# UNTED STATES GOVERNMENT, NOR THE UNITED STATES DEPARTMENT OF ENERGY, NOR +# UCHICAGO ARGONNE, LLC, NOR ANY OF THEIR EMPLOYEES, MAKES ANY WARRANTY, +# EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE +# ACCURACY, COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, DATA, APPARATUS, +# PRODUCT, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT INFRINGE +# PRIVATELY OWNED RIGHTS. +# +# ***************************************************************************** + +import numpy as np +import ctypes as ct +import os + +#Define where the library is and load it +_path = os.path.dirname('__file__') +libpygio = ct.CDLL(os.path.abspath('libpygio.so')) +#we need to define the return type ("restype") and +#the argument types +libpygio.get_elem_num.restype=ct.c_int64 +libpygio.get_elem_num.argtypes=[ct.c_char_p] + +libpygio.get_variable_type.restype=ct.c_int +libpygio.get_variable_type.argtypes=[ct.c_char_p,ct.c_char_p] + +libpygio.read_gio_int32.restype=None +libpygio.read_gio_int32.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_int)] + +libpygio.read_gio_int64.restype=None +libpygio.read_gio_int64.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_int64)] + +libpygio.read_gio_float.restype=None +libpygio.read_gio_float.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_float)] + +libpygio.read_gio_double.restype=None +libpygio.read_gio_double.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_double)] + +libpygio.inspect_gio.restype=None +libpygio.inspect_gio.argtypes=[ct.c_char_p] + +def gio_read(file_name,var_name): + var_size = libpygio.get_elem_num(file_name) + var_type = libpygio.get_variable_type(file_name,var_name) + if(var_type==10): + print "Variable not found" + return + elif(var_type==9): + print "variable type not known (not int32/int64/float/double)" + elif(var_type==0): + #float + result = np.ndarray(var_size,dtype=np.float32) + libpygio.read_gio_float(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_float))) + return result + elif(var_type==1): + #double + result = np.ndarray(var_size,dtype=np.float64) + libpygio.read_gio_double(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_double))) + return result + elif(var_type==2): + #int32 + result = np.ndarray(var_size,dtype=np.int32) + libpygio.read_gio_int32(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_int32))) + return result + elif(var_type==3): + #int64 + result = np.ndarray(var_size,dtype=np.int64) + libpygio.read_gio_int64(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_int64))) + return result + +def gio_inspect(file_name): + libpygio.inspect_gio(file_name) + diff --git a/python/lib/gio.cxx b/python/lib/gio.cxx new file mode 100644 index 0000000000000000000000000000000000000000..82cebd4cb4dcb376a434d09aab08099899f2ce35 --- /dev/null +++ b/python/lib/gio.cxx @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2015, UChicago Argonne, LLC + * All Rights Reserved + * + * Generic IO (ANL-15-066) + * Hal Finkel, Argonne National Laboratory + * + * OPEN SOURCE LICENSE + * + * Under the terms of Contract No. DE-AC02-06CH11357 with UChicago Argonne, + * LLC, the U.S. Government retains certain rights in this software. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of UChicago Argonne, LLC or the Department of Energy + * nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * ***************************************************************************** + * + * DISCLAIMER + * THE SOFTWARE IS SUPPLIED “AS IS†WITHOUT WARRANTY OF ANY KIND. NEITHER THE + * UNTED STATES GOVERNMENT, NOR THE UNITED STATES DEPARTMENT OF ENERGY, NOR + * UCHICAGO ARGONNE, LLC, NOR ANY OF THEIR EMPLOYEES, MAKES ANY WARRANTY, + * EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE + * ACCURACY, COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, DATA, APPARATUS, + * PRODUCT, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT INFRINGE + * PRIVATELY OWNED RIGHTS. + * + * ***************************************************************************** + */ + +#include "gio.h" +#include <iostream> + + void read_gio_float(char* file_name, char* var_name, float* data){ + read_gio<float>(file_name,var_name,data); + } + void read_gio_double(char* file_name, char* var_name, double* data){ + read_gio<double>(file_name,var_name,data); + } + void read_gio_int32(char* file_name, char* var_name, int* data){ + read_gio<int>(file_name,var_name,data); + } + void read_gio_int64(char* file_name, char* var_name, int64_t* data){ + read_gio<int64_t>(file_name,var_name,data); + } + + int64_t get_elem_num(char* file_name){ + gio::GenericIO reader(file_name); + reader.openAndReadHeader(gio::GenericIO::MismatchAllowed); + int num_ranks = reader.readNRanks(); + uint64_t size = 0; + for(int i =0;i<num_ranks;++i) + size +=reader.readNumElems(i); + reader.close(); + return size; + } + + var_type get_variable_type(char* file_name,char* var_name){ + gio::GenericIO reader(file_name); + std::vector<gio::GenericIO::VariableInfo> VI; + reader.openAndReadHeader(gio::GenericIO::MismatchAllowed); + reader.getVariableInfo(VI); + + int num =VI.size(); + for(int i =0;i<num;++i){ + gio::GenericIO::VariableInfo vinfo = VI[i]; + if(vinfo.Name == var_name){ + if(vinfo.IsFloat && vinfo.Size == 4) + return float_type; + else if(vinfo.IsFloat && vinfo.Size == 8) + return double_type; + else if(!vinfo.IsFloat && vinfo.Size == 4) + return int32_type; + else if(!vinfo.IsFloat && vinfo.Size == 8) + return int64_type; + else + return type_not_found; + } + } + return var_not_found; + + } + +extern "C" void inspect_gio(char* file_name){ + int64_t size = get_elem_num(file_name); + gio::GenericIO reader(file_name); + std::vector<gio::GenericIO::VariableInfo> VI; + reader.openAndReadHeader(gio::GenericIO::MismatchAllowed); + reader.getVariableInfo(VI); + std::cout<<"Number of Elements: "<<size<<std::endl; + int num =VI.size(); + std::cout<<"[data type] Variable name"<<std::endl; + std::cout<<"---------------------------------------------"<<std::endl; + for(int i =0;i<num;++i){ + gio::GenericIO::VariableInfo vinfo = VI[i]; + + if(vinfo.IsFloat) + std::cout<<"[f"; + else + std::cout<<"[i"; + std::cout<<" "<<vinfo.Size*8<<"] "; + std::cout<<vinfo.Name<<std::endl; + } + std::cout<<"\n(i=integer,f=floating point, number bits size)"<<std::endl; +} + diff --git a/python/lib/gio.h b/python/lib/gio.h new file mode 100644 index 0000000000000000000000000000000000000000..fcfa8cf35ad35cc565dd7318bbdd0e3ec14b53db --- /dev/null +++ b/python/lib/gio.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2015, UChicago Argonne, LLC + * All Rights Reserved + * + * Generic IO (ANL-15-066) + * Hal Finkel, Argonne National Laboratory + * + * OPEN SOURCE LICENSE + * + * Under the terms of Contract No. DE-AC02-06CH11357 with UChicago Argonne, + * LLC, the U.S. Government retains certain rights in this software. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of UChicago Argonne, LLC or the Department of Energy + * nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * ***************************************************************************** + * + * DISCLAIMER + * THE SOFTWARE IS SUPPLIED “AS IS†WITHOUT WARRANTY OF ANY KIND. NEITHER THE + * UNTED STATES GOVERNMENT, NOR THE UNITED STATES DEPARTMENT OF ENERGY, NOR + * UCHICAGO ARGONNE, LLC, NOR ANY OF THEIR EMPLOYEES, MAKES ANY WARRANTY, + * EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE + * ACCURACY, COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, DATA, APPARATUS, + * PRODUCT, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT INFRINGE + * PRIVATELY OWNED RIGHTS. + * + * ***************************************************************************** + */ + +#include <GenericIO.h> + +#include <stdint.h> +#include <sstream> + +template <class T> +void read_gio(char* file_name, std::string var_name, T*& data){ + gio::GenericIO reader(file_name); + reader.openAndReadHeader(gio::GenericIO::MismatchAllowed); + int num_ranks = reader.readNRanks(); + uint64_t max_size = 0; + uint64_t rank_size[num_ranks]; + for(int i =0;i<num_ranks;++i){ + rank_size[i] = reader.readNumElems(i); + if(max_size < rank_size[i]) + max_size = rank_size[i]; + } + T* rank_data = new T[max_size+reader.requestedExtraSpace()/sizeof(T)]; + int64_t offset =0; + reader.addVariable(var_name,rank_data,true); + for(int i=0;i<num_ranks;++i){ + reader.readData(i,false); + std::copy(rank_data,rank_data+rank_size[i],data+offset); + offset +=rank_size[i]; + } + delete [] rank_data; + reader.close(); +} +extern "C" int64_t get_elem_num(char* file_name); + +extern "C" void read_gio_float (char* file_name, char* var_name, float* data); +extern "C" void read_gio_double(char* file_name, char* var_name, double* data); +extern "C" void read_gio_int32 (char* file_name, char* var_name, int* data); +extern "C" void read_gio_int64 (char* file_name, char* var_name, int64_t* data); +enum var_type{ + float_type=0, + double_type=1, + int32_type=2, + int64_type=3, + type_not_found=9, + var_not_found=10 +}; +extern "C" var_type get_variable_type(char* file_name,char* var_name); +extern "C" void inspect_gio(char* file_name);