00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef COMPONENTS_TRIG_CPU_ALLREDUCE_NARYTREE_H
00014 #define COMPONENTS_TRIG_CPU_ALLREDUCE_NARYTREE_H
00015
00016 #include "algorithm.h"
00017 #include "trig_cpu.h"
00018
00019 class allreduce_narytree : public algorithm {
00020 public:
00021 allreduce_narytree(trig_cpu *cpu) : algorithm(cpu)
00022 {
00023 radix = cpu->getRadix();
00024 }
00025
00026 bool
00027 operator()(Event *ev)
00028 {
00029 int handle;
00030
00031 switch (state) {
00032 case 0:
00033
00034
00035 start_time = cpu->getCurrentSimTimeNano();
00036 cpu->addBusyTime("200ns");
00037
00038 my_num_children = 0;
00039 for (int i = 1 ; i <= radix ; ++i) {
00040 if (radix * my_id + i < num_nodes) my_num_children++;
00041 }
00042
00043 loop_var = 1;
00044 state = (0 == my_num_children) ? 3 : 1;
00045 break;
00046
00047 case 1:
00048 if (loop_var <= my_num_children) {
00049 if (cpu->recv(my_id * radix + loop_var, NULL, handle)) {
00050 loop_var++;
00051 }
00052 break;
00053 }
00054 state = 2;
00055 break;
00056
00057 case 2:
00058 if (! cpu->waitall()) break;
00059
00060 for (int i = 0 ; i < (((my_num_children - 1) / 8) + 1) ; ++i) {
00061 cpu->addBusyTime("100ns");
00062 }
00063 loop_var = 1;
00064 state = (my_id == 0) ? 6 : 3;
00065
00066 case 3:
00067 cpu->send((my_id - 1) / radix, 0);
00068 state = 4;
00069 break;
00070
00071 case 4:
00072 if (cpu->recv((my_id - 1) / radix, NULL, handle)) {
00073 state = 5;
00074 }
00075 break;
00076
00077 case 5:
00078 if (! cpu->waitall()) break;
00079 state = 6;
00080 break;
00081
00082 case 6:
00083 if (loop_var <= my_num_children) {
00084 cpu->send(my_id * radix + loop_var, 0);
00085 loop_var++;
00086 break;
00087 }
00088 state = 7;
00089 break;
00090
00091 case 7:
00092 trig_cpu::addTimeToStats(cpu->getCurrentSimTimeNano() - start_time);
00093 state = 0;
00094 return true;
00095
00096 default:
00097 printf("tree: unhandled state: %d\n", state);
00098 exit(1);
00099 }
00100
00101 return false;
00102 }
00103
00104 private:
00105 allreduce_narytree();
00106 allreduce_narytree(const algorithm& a);
00107 void operator=(allreduce_narytree const&);
00108
00109 SimTime_t start_time;
00110 int radix;
00111 int loop_var;
00112 int my_num_children;
00113 };
00114
00115 #endif // COMPONENTS_TRIG_CPU_ALLREDUCE_NARYTREE_H