Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The c++ examples Tesh files.
[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 <Msg.hpp>\r
8 \r
9 #include <iostream>\r
10 using namespace std;\r
11 \r
12 \r
13 #ifndef BUFFMAX\r
14 #define BUFFMAX 260\r
15 #endif\r
16 \r
17 MSG_IMPLEMENT_DYNAMIC(Master, Process);\r
18 \r
19 int Master::main(int argc, char** argv)\r
20 {\r
21         int channel = 0;\r
22         char buff[BUFFMAX + 1] = {0};\r
23         int numberOfTasks;              \r
24         double taskComputeSize;         \r
25         double taskCommunicateSize;\r
26         StringHelper s;\r
27 \r
28         if (argc < 3) \r
29         {\r
30                 error("Master needs 3 arguments");\r
31                 exit(1);\r
32         }\r
33         \r
34         info("Hello");\r
35         \r
36         int slaveCount = 0;\r
37         Host* slaves = NULL;\r
38 \r
39         \r
40         info( TEXT_("argc=") + TEXT_(argc));\r
41         \r
42         for (int i = 0; i< argc; i++)       \r
43                 info(TEXT_("argv:") + TEXT_(argv[i]));\r
44         \r
45         sscanf(argv[0],"%d", &numberOfTasks);\r
46         \r
47         sscanf(argv[1],"%lg", &taskComputeSize);\r
48         \r
49         sscanf(argv[2],"%lg", &taskCommunicateSize);\r
50         \r
51         BasicTaskPtr* todo = new BasicTaskPtr[numberOfTasks];\r
52         \r
53         for (int i = 0; i < numberOfTasks; i++) \r
54                 todo[i] = new BasicTask((TEXT_("Task_") + TEXT_(i)), taskComputeSize, taskCommunicateSize);\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         info(TEXT_("Got slave(s) :") + TEXT_(slaveCount));\r
74         \r
75         for (int i = 0; i < slaveCount; i++)\r
76                 info(TEXT_("\t") + TEXT_(slaves[i].getName()));\r
77         \r
78          info(TEXT_("Got ") + TEXT_(numberOfTasks) + TEXT_(" task to process."));\r
79         \r
80         for (int i = 0; i < numberOfTasks; i++) \r
81         {\r
82                 info(TEXT_("Sending \"") + TEXT_(todo[i]->getName()) + TEXT_("\" to \"") + TEXT_(slaves[i % slaveCount].getName()) + TEXT_("\""));\r
83         \r
84                 if(!strcmp(Host::currentHost().getName(), slaves[i % slaveCount].getName())) \r
85                         info("Hey ! It's me ! ");\r
86 \r
87                 slaves[i % slaveCount].put(channel, todo[i]);\r
88         }\r
89         \r
90         info("Send completed");\r
91         \r
92         info("All tasks have been dispatched. Let's tell everybody the computation is over.");\r
93         \r
94         for (int i = 0; i < slaveCount; i++) \r
95                         slaves[i].put(channel, new FinalizeTask());\r
96 \r
97         delete[] todo;\r
98         delete[] slaves;\r
99         \r
100         info("Goodbye now!");\r
101 \r
102         delete this;\r
103 \r
104         return 0;\r
105 }