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