00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _util_group_file_h
00033 #define _util_group_file_h
00034
00035 #include <iostream>
00036
00037 #include <scconfig.h>
00038 #include <util/class/class.h>
00039 #include <util/group/thread.h>
00040 #include <util/group/memory.h>
00041
00042 namespace sc {
00043
00055 class FileGrp: public DescribedClass {
00056 private:
00057 int datafile_;
00058 char *filename_;
00059
00060 Ref<ThreadLock> *locks_;
00061 int nlock_;
00062
00063 void init_locks();
00064
00065
00066 protected:
00067
00068
00069
00070 int me_;
00071 int n_;
00072 distsize_t *offsets_;
00073
00074
00075 int debug_;
00076
00077 void obtain_local_lock(size_t start, size_t fence);
00078 void release_local_lock(size_t start, size_t fence);
00079 public:
00080 FileGrp();
00081 FileGrp(const Ref<KeyVal>&);
00082 virtual ~FileGrp();
00083
00085 void open();
00087 void close();
00089 void set_filename(char *name);
00091 const char* get_filename() const { return datafile_; };
00092
00094 int me() const { return me_; }
00096 int n() const { return n_; }
00097
00101 virtual void set_localsize(size_t) = 0;
00103 size_t localsize() { return distsize_to_size(offsets_[me_+1]-offsets_[me_]); }
00105 distsize_t localoffset() { return offsets_[me_]; }
00107 int size(int node)
00108 { return distsize_to_size(offsets_[node+1] - offsets_[node]); }
00110 distsize_t offset(int node) { return offsets_[node]; }
00112 distsize_t totalsize() { return offsets_[n_]; }
00113
00115 virtual void activate();
00117 virtual void deactivate();
00118
00120 virtual void *obtain_writeonly(distsize_t offset, int size) = 0;
00126 virtual void *obtain_readwrite(distsize_t offset, int size) = 0;
00128 virtual void *obtain_readonly(distsize_t offset, int size) = 0;
00130 virtual void release_readonly(void *data, distsize_t offset, int size) = 0;
00132 virtual void release_writeonly(void *data, distsize_t offset, int size)=0;
00135 virtual void release_readwrite(void *data, distsize_t offset, int size)=0;
00136
00137 virtual void sum_reduction(double *data, distsize_t doffset, int dsize);
00138 virtual void sum_reduction_on_node(double *data, size_t doffset, int dsize,
00139 int node = -1);
00140
00143 virtual void sync() = 0;
00144
00151 virtual void catchup();
00152
00154 virtual void print(std::ostream &o = ExEnv::out0()) const;
00155
00163 static FileGrp* initial_filegrp(int &argc, char** argv);
00164 static FileGrp* initial_filegrp();
00167 static void set_default_filegrp(const Ref<FileGrp>&);
00169 static FileGrp* get_default_filegrp();
00171 virtual FileGrp* clone() =0;
00172 };
00173
00174 }
00175
00176 #endif
00177
00178
00179
00180
00181