PaCO++
0.05
|
00001 #include "ParisBasicExample.h" 00002 #include <string.h> 00003 #include <stdlib.h> 00004 #include <iostream> 00005 00006 ParisBasicExample::ParisBasicExample() : _data_size(0), _data_elt_nb(0), 00007 _my_rank(-1), _server_nb_nodes(-1) 00008 { 00009 _user_data = 0; 00010 temp_buffer = 0; 00011 _length = 0; 00012 } 00013 00014 ParisBasicExample::~ParisBasicExample() 00015 { 00016 delete position; 00017 delete _data_rst; 00018 } 00019 00020 void 00021 ParisBasicExample::setEltSize(long size) 00022 { 00023 _data_size = size; 00024 if (_data_elt_nb && _server_nb_nodes) 00025 { 00026 for (int i = 0; i < _server_nb_nodes; i++) 00027 { 00028 _data_rst[i] = _data_size * _data_elt_nb; 00029 } 00030 } 00031 } 00032 00033 void 00034 ParisBasicExample::setNbElt(long elt_nb) 00035 { 00036 _data_elt_nb = elt_nb; 00037 if (_data_size && _server_nb_nodes) 00038 { 00039 for (int i = 0; i < _server_nb_nodes; i++) 00040 { 00041 _data_rst[i] = _data_size * _data_elt_nb; 00042 } 00043 } 00044 } 00045 00046 void 00047 ParisBasicExample::setSourceTopology(PaCO::PacoTopology_t topo) 00048 { 00049 _srcTopo = topo; 00050 } 00051 00052 PaCO::PacoTopology_t 00053 ParisBasicExample::getSourceTopology() 00054 { 00055 return _srcTopo; 00056 } 00057 00058 void 00059 ParisBasicExample::setDestTopology(PaCO::PacoTopology_t topo) 00060 { 00061 _destTopo = topo; 00062 _server_nb_nodes = _destTopo.total; 00063 position = new long[_server_nb_nodes]; 00064 _data_rst = new long[_server_nb_nodes]; 00065 for (int i = 0; i < _server_nb_nodes; i++) 00066 { 00067 position[i] = 0; 00068 _data_rst[i] = 0; 00069 } 00070 if (_data_size && _data_elt_nb) 00071 { 00072 for (int i = 0; i < _server_nb_nodes; i++) 00073 { 00074 _data_rst[i] = _data_size * _data_elt_nb; 00075 } 00076 } 00077 } 00078 00079 PaCO::PacoTopology_t 00080 ParisBasicExample::getDestTopology() 00081 { 00082 return _destTopo; 00083 } 00084 00085 void 00086 ParisBasicExample::setNodeRank(long Rank) 00087 { 00088 _my_rank = Rank; 00089 } 00090 00091 long 00092 ParisBasicExample::getNodeRank() 00093 { 00094 return _my_rank; 00095 } 00096 00097 PieceToSend * 00098 ParisBasicExample::computePiecesToSend() 00099 { 00100 // Compute total data length 00101 long total_length = _data_size * _data_elt_nb; 00102 // We send at each server node the 00103 // same data 00104 PieceToSend * comm_vector = new PieceToSend[_server_nb_nodes]; 00105 for (int i = 0; i < _server_nb_nodes; i++) 00106 { 00107 comm_vector[i].sourceNode = _my_rank; 00108 comm_vector[i].destNode = i; 00109 if (i == _my_rank) 00110 { 00111 comm_vector[i].size = total_length; 00112 } 00113 else 00114 { 00115 comm_vector[i].size = 0; 00116 } 00117 } 00118 return comm_vector; 00119 } 00120 00121 void 00122 ParisBasicExample::setDataPtr(void* dataPtr) 00123 { 00124 _user_data = (char*) dataPtr; 00125 cerr << "_data_size " <<_data_size << endl; 00126 cerr << "_data_elt_nb " <<_data_elt_nb << endl; 00127 cerr << "_my_rank " <<_my_rank << endl; 00128 cerr << "_server_nb_nodes " <<_server_nb_nodes << endl; 00129 cerr << "_data_rst " <<_data_rst << endl; 00130 cerr << " position" << position << endl; 00131 } 00132 00133 void * 00134 ParisBasicExample::getClientData(int server_node, long & size, long & length, bool & end) 00135 { 00136 if (size > 0) 00137 { 00138 if (temp_buffer) clientFree(server_node); 00139 // First get position 00140 long actual_pos = position[server_node]; 00141 // Test if size > _data_rst 00142 long real_size = 0; 00143 if (size > _data_rst[server_node]) 00144 { 00145 real_size = _data_rst[server_node]; 00146 size = size - _data_rst[server_node]; 00147 _data_rst[server_node] = 0; 00148 } 00149 else 00150 { 00151 real_size = size; 00152 _data_rst[server_node] = _data_rst[server_node] - size; 00153 size = 0; 00154 } 00155 length = real_size / _data_size; 00156 _length = length; 00157 end = true; 00158 position[server_node] = actual_pos + real_size; 00159 if (_data_rst[server_node] == 0) 00160 { 00161 _data_rst[server_node] = _data_size * _data_elt_nb; 00162 position[server_node] = 0; 00163 } 00164 return &_user_data[actual_pos]; 00165 } 00166 else 00167 { 00168 length = 0; 00169 _length = length; 00170 end = true; 00171 return NULL; 00172 } 00173 return NULL; 00174 } 00175 00176 void 00177 ParisBasicExample::clientFree() 00178 { 00179 free(temp_buffer); 00180 } 00181 00182 void 00183 ParisBasicExample::clientFree(int server_node) 00184 { 00185 free(temp_buffer); 00186 } 00187 00188 bool 00189 ParisBasicExample::insertData(void* rcptBuf) 00190 { 00191 _user_data = (char *) rcptBuf; 00192 return true; 00193 } 00194 00195 void * 00196 ParisBasicExample::getServerData(long & length) 00197 { 00198 length = _length; 00199 return _user_data; 00200 } 00201 00202 void 00203 ParisBasicExample::setDescr(void * descr) 00204 { 00205 _length = *((CORBA::Short*) descr); 00206 cerr << " Set Descr : "<< _length << endl; 00207 } 00208 00209 void * 00210 ParisBasicExample::getDescr() 00211 { 00212 return &_length; 00213 }