Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
not needed now
[simgrid.git] / examples / cxx / basic / Master.cxx
1 #include "Master.hpp"\r
2 #include "BasicTask.hpp"\r
3 #include "FinalizeTask.hpp"\r
4 #include <Host.hpp>\r
5 #include <HostNotFoundException.hpp>\r
6 \r
7 #include <iostream>\r
8 using namespace std;\r
9 \r
10 \r
11 #ifndef BUFFMAX\r
12 #define BUFFMAX 260\r
13 #endif\r
14 \r
15 MSG_IMPLEMENT_DYNAMIC(Master, Process);\r
16 \r
17 int Master::main(int argc, char** argv)\r
18 {\r
19         int channel = 0;\r
20         char buff[BUFFMAX + 1] = {0};\r
21         int numberOfTasks;              \r
22         double taskComputeSize;         \r
23         double taskCommunicateSize;\r
24 \r
25         if (argc < 3) \r
26         {\r
27                 cerr <<"Master needs 3 arguments" << endl;\r
28                 exit(1);\r
29         }\r
30         \r
31         cout << "Hello I'm " << getName() << " on " << getHost().getName() << "!" << endl;\r
32         \r
33         int slaveCount = 0;\r
34         Host* slaves = NULL;\r
35         \r
36         cout << "argc=" <<  argc << endl;\r
37         \r
38         for (int i = 0; i< argc; i++)       \r
39                 cout << "argv:" << argv[i] << endl;\r
40         \r
41         sscanf(argv[0],"%d", &numberOfTasks);\r
42         \r
43         sscanf(argv[1],"%lg", &taskComputeSize);\r
44         \r
45         sscanf(argv[2],"%lg", &taskCommunicateSize);\r
46         \r
47         BasicTaskPtr* todo = new BasicTaskPtr[numberOfTasks];\r
48         \r
49         for (int i = 0; i < numberOfTasks; i++) \r
50         {\r
51                 sprintf(buff,"Task_%d",i);\r
52                 todo[i] = new BasicTask(buff, taskComputeSize, taskCommunicateSize);\r
53                 memset(buff, 0 , BUFFMAX + 1); \r
54         }\r
55         \r
56         slaveCount = argc - 3;\r
57         slaves = new Host[slaveCount];\r
58         \r
59         for(int i = 3; i < argc ; i++)  \r
60         {\r
61                 try \r
62                 {\r
63                         slaves[i-3] = Host::getByName(argv[i]);\r
64                 }\r
65                 \r
66                 catch(HostNotFoundException e) \r
67                 {\r
68                         cerr << e.toString() <<". Stopping Now!" << endl;\r
69                         exit(1);\r
70                 }\r
71         }\r
72         \r
73         cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Got slave(s) :"  << slaveCount << endl;\r
74         \r
75         for (int i = 0; i < slaveCount; i++)\r
76                 cout <<"[" << getName() << ":" << getHost().getName() << "] " << "\t" << slaves[i].getName() << endl;\r
77         \r
78         cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Got " << numberOfTasks << " task to process." << endl;\r
79         \r
80         for (int i = 0; i < numberOfTasks; i++) \r
81         {\r
82                 cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Sending \"" << todo[i]->getName() << "\" to \"" << slaves[i % slaveCount].getName() << "\"" << endl;\r
83         \r
84                 if(!strcmp(Host::currentHost().getName(), slaves[i % slaveCount].getName())) \r
85                         cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Hey ! It's me ! ";\r
86         \r
87                 slaves[i % slaveCount].put(channel, todo[i]);\r
88         }\r
89         \r
90         cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Send completed" << endl;\r
91         \r
92         cout <<"[" << getName() << ":" << getHost().getName() << "] " << "All tasks have been dispatched. Let's tell everybody the computation is over." << endl;\r
93         \r
94         for (int i = 0; i < slaveCount; i++) \r
95         {\r
96                 slaves[i].put(channel, new FinalizeTask());\r
97         }\r
98         \r
99 \r
100         for(int i = 0; i < numberOfTasks; i++)\r
101                 delete todo[i];\r
102 \r
103         delete[] todo;\r
104 \r
105         delete[] slaves;\r
106         \r
107         cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Goodbye now!" << endl;\r
108 \r
109         return 0;\r
110 }