00001 #include "charm++.h"
00002 #include "ck.h"
00003 #include "ckarrayoptions.h"
00004
00005 CkArrayOptions::CkArrayOptions(void)
00006 : start(),
00007 end(),
00008 step(),
00009 numInitial(),
00010 bounds(),
00011 map(_defaultArrayMapID) {
00012 init();
00013 }
00014
00015 CkArrayOptions::CkArrayOptions(int ndims, int dims[])
00016 : start(CkArrayIndex(ndims, 0)),
00017 end(CkArrayIndex(ndims, dims)),
00018 step(CkArrayIndex(ndims, 1)),
00019 numInitial(end),
00020 bounds(end),
00021 map(_defaultArrayMapID) {
00022 init();
00023 }
00024
00025 CkArrayOptions::CkArrayOptions(int ni1)
00026 : start(CkArrayIndex1D(0)),
00027 end(CkArrayIndex1D(ni1)),
00028 step(CkArrayIndex1D(1)),
00029 numInitial(end),
00030 bounds(end),
00031 map(_defaultArrayMapID) {
00032 init();
00033 }
00034
00035 CkArrayOptions::CkArrayOptions(int ni1, int ni2)
00036 : start(CkArrayIndex2D(0, 0)),
00037 end(CkArrayIndex2D(ni1, ni2)),
00038 step(CkArrayIndex2D(1, 1)),
00039 numInitial(end),
00040 bounds(end),
00041 map(_defaultArrayMapID) {
00042 init();
00043 }
00044
00045 CkArrayOptions::CkArrayOptions(int ni1, int ni2, int ni3)
00046 : start(CkArrayIndex3D(0, 0, 0)),
00047 end(CkArrayIndex3D(ni1, ni2, ni3)),
00048 step(CkArrayIndex3D(1, 1, 1)),
00049 numInitial(end),
00050 bounds(end),
00051 map(_defaultArrayMapID) {
00052 init();
00053 }
00054
00055 CkArrayOptions::CkArrayOptions(short int ni1, short int ni2, short int ni3,
00056 short int ni4)
00057 : start(CkArrayIndex4D(0, 0, 0, 0)),
00058 end(CkArrayIndex4D(ni1, ni2, ni3, ni4)),
00059 step(CkArrayIndex4D(1, 1, 1, 1)),
00060 numInitial(end),
00061 bounds(end),
00062 map(_defaultArrayMapID) {
00063 init();
00064 }
00065
00066 CkArrayOptions::CkArrayOptions(short int ni1, short int ni2, short int ni3, short int ni4,
00067 short int ni5)
00068 : start(CkArrayIndex5D(0, 0, 0, 0, 0)),
00069 end(CkArrayIndex5D(ni1, ni2, ni3, ni4, ni5)),
00070 step(CkArrayIndex5D(1, 1, 1, 1, 1)),
00071 numInitial(end),
00072 bounds(end),
00073 map(_defaultArrayMapID) {
00074 init();
00075 }
00076
00077 CkArrayOptions::CkArrayOptions(short int ni1, short int ni2, short int ni3, short int ni4,
00078 short int ni5,
00079 short int ni6)
00080 : start(CkArrayIndex6D(0, 0, 0, 0, 0, 0)),
00081 end(CkArrayIndex6D(ni1, ni2, ni3, ni4, ni5, ni6)),
00082 step(CkArrayIndex6D(1, 1, 1, 1, 1, 1)),
00083 numInitial(end),
00084 bounds(end),
00085 map(_defaultArrayMapID) {
00086 init();
00087 }
00088
00089 CkArrayOptions::CkArrayOptions(CkArrayIndex s, CkArrayIndex e, CkArrayIndex step)
00090 : start(s),
00091 end(e),
00092 step(step),
00093 numInitial(end),
00094 bounds(end),
00095 map(_defaultArrayMapID) {
00096 init();
00097 }
00098
00099 void CkArrayOptions::init() {
00100 locMgr.setZero();
00101 mCastMgr.setZero();
00102 anytimeMigration = _isAnytimeMigration;
00103 staticInsertion = _isStaticInsertion;
00104 reductionClient.type = CkCallback::invalid;
00105 disableNotifyChildInRed = !_isNotifyChildInRed;
00106 broadcastViaScheduler = false;
00107 sectionAutoDelegate = true;
00108 }
00109
00110 CkArrayOptions& CkArrayOptions::setStaticInsertion(bool b) {
00111 staticInsertion = b;
00112 if (b && map == _defaultArrayMapID) map = _fastArrayMapID;
00113 return *this;
00114 }
00115
00117 CkArrayOptions& CkArrayOptions::bindTo(const CkArrayID& b) {
00118 CkArray* arr = CProxy_CkArray(b).ckLocalBranch();
00119
00120
00121
00122 return setLocationManager(arr->getLocMgr()->getGroupID());
00123 }
00124
00125 CkArrayOptions& CkArrayOptions::addListener(CkArrayListener* listener) {
00126 arrayListeners.push_back(listener);
00127 return *this;
00128 }
00129
00130 void CkArrayOptions::updateIndices() {
00131 bool shorts = numInitial.dimension > 3;
00132 start = step = end = numInitial;
00133
00134 for (int d = 0; d < numInitial.dimension; d++) {
00135 if (shorts) {
00136 ((short*)start.data())[d] = 0;
00137 ((short*)step.data())[d] = 1;
00138 } else {
00139 start.data()[d] = 0;
00140 step.data()[d] = 1;
00141 }
00142 }
00143 }
00144
00145 void CkArrayOptions::updateNumInitial() {
00146 if (end.dimension != start.dimension || end.dimension != step.dimension) {
00147 return;
00148 }
00149
00150 bool shorts = end.dimension > 3;
00151 numInitial = end;
00152 for (int d = 0; d < end.dimension; d++) {
00153 int diff, increment, num;
00154
00155
00156 if (shorts) {
00157 diff = ((short*)end.data())[d] - ((short*)start.data())[d];
00158 increment = ((short*)step.data())[d];
00159 } else {
00160 diff = end.data()[d] - start.data()[d];
00161 increment = step.data()[d];
00162 }
00163
00164
00165 num = diff / increment;
00166 if (diff < 0) {
00167 num = 0;
00168 } else if (diff % increment > 0) {
00169 num++;
00170 }
00171
00172
00173 if (shorts) {
00174 ((short*)numInitial.data())[d] = (short)num;
00175 } else {
00176 numInitial.data()[d] = num;
00177 }
00178 }
00179 }
00180
00181 void CkArrayOptions::pup(PUP::er& p) {
00182 p | start;
00183 p | end;
00184 p | step;
00185 p | numInitial;
00186 p | bounds;
00187 p | map;
00188 p | locMgr;
00189 p | mCastMgr;
00190 p | arrayListeners;
00191 p | reductionClient;
00192 p | initCallback;
00193 p | anytimeMigration;
00194 p | disableNotifyChildInRed;
00195 p | staticInsertion;
00196 p | broadcastViaScheduler;
00197 p | sectionAutoDelegate;
00198 }
00199
00200 CkArrayListener::CkArrayListener(int nInts_) : nInts(nInts_) { dataOffset = -1; }
00201 CkArrayListener::CkArrayListener(CkMigrateMessage* m) {
00202 nInts = -1;
00203 dataOffset = -1;
00204 }
00205 void CkArrayListener::pup(PUP::er& p) {
00206 p | nInts;
00207 p | dataOffset;
00208 }
00209
00210 void CkArrayListener::ckRegister(CkArray* arrMgr, int dataOffset_) {
00211 if (dataOffset != -1) CkAbort("Cannot register an ArrayListener twice!\n");
00212 dataOffset = dataOffset_;
00213 }