void init_generator_test() { cpu_set_t bitmap; init_generator(); // setting current cpu to 0 sched_getaffinity(0, sizeof(bitmap), &bitmap); CU_ASSERT_EQUAL(CPU_COUNT(&bitmap), 1); // checking if number of cpu > 0 CU_ASSERT_NOT_EQUAL(CPU_ISSET(0, &bitmap),0); // checking if it is set cpu number 0 CPU_ZERO(&bitmap); CPU_SET(1,&bitmap); sched_setaffinity(0, sizeof(bitmap), &bitmap); init_generator(); sched_getaffinity(0, sizeof(bitmap), &bitmap); CU_ASSERT_EQUAL(CPU_COUNT(&bitmap),1); CU_ASSERT_NOT_EQUAL(CPU_ISSET(0, &bitmap), 0); }
void set_seed(int cg1, int cg2) /******************************************************************************/ /* Purpose: SET_SEED resets the initial seed and the state of generator G. Licensing: This code is distributed under the GNU LGPL license. Modified: 01 April 2013 Author: Original Pascal version by Pierre L'Ecuyer, Serge Cote. C version by John Burkardt. Reference: Pierre LEcuyer, Serge Cote, Implementing a Random Number Package with Splitting Facilities, ACM Transactions on Mathematical Software, Volume 17, Number 1, March 1991, pages 98-111. Parameters: Input, int CG1, CG2, the CG values for generator G. 1 <= CG1 < 2147483563 1 <= CG2 < 2147483399 */ { int g; //int i; const int m1 = 2147483563; const int m2 = 2147483399; int t; if (cg1 < 1 || m1 <= cg1) { fprintf(stderr, "\n"); fprintf(stderr, "SET_SEED - Fatal error!\n"); fprintf(stderr, " Input parameter CG1 out of bounds.\n"); exit(1); } if (cg2 < 1 || m2 <= cg2) { fprintf(stderr, "\n"); fprintf(stderr, "SET_SEED - Fatal error!\n"); fprintf(stderr, " Input parameter CG2 out of bounds.\n"); exit(1); } /* Check whether the package must be initialized. */ if (!initialized_get()) { initialize(); } /* Retrieve the current generator index. */ g = cgn_get(); /* Set the seeds. */ cg_set(g, cg1, cg2); /* Initialize the generator. */ t = 0; init_generator(t); return; }
/*功能:生成模拟数据 7.25 陈建海提交*/ void GenerateData1(char *rootdir) { /*初始化全局输入数据结构*/ cls_st_datagenerator dg; cls_st_drscontrol dc; char url[200]; int vnum,pnum,grnum,afnum,emptypmnum,n; float a,b,htv; int choice,j,sel; srand((unsigned)time(NULL)); /*初始化*/ init_shared_data(); /*生成模拟数据*/ init_drscontrol(&dc); /*初始化共享数据指针*/ dc.sd=&g_sharedata; /*1.加载生成模拟数据的函数,产生的数据在global中*/ init_generator(&dg); dg.sd=&g_sharedata; /*初始化异构物理机规格*/ dg.createPMV(); /**/ printf("Now we generate simulation data:\n"); printf("输入:1.生成PM与VM数据;2-物理拓扑数据。\n"); scanf("%d",&sel); if(sel==2) goto topo; printf("1.生成PM与VM数据:要求输入VM数(待放置),PM数(包括空载),VM缩放系数,冷热度\n"); /*支持多场景创建*/ printf("请选择调度决策类型生成相应数据:\n 1-初始放置;\n 2-动态调度:负载均衡;\n"); printf(" 3-动态调度-热点消除;\n 4-动态调度-冷点整合.\n 0-退出。\n-----------------\n输入:"); scanf("%d",&sel); switch (sel) { case 1:/*初始放置数据:包括各种冷热度,<0.2,<0.7,<0.9*/ //scanf("%f%f%f",&a,&b,&htv); printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n"); printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n"); printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n"); printf("输入样式如:\n"); printf("3 ----------表示3种规格\n"); printf("100 0.0 0.1 0.2 ---------表示第一组规格\n"); printf("30 0.5 0.8 0.9 ----------表示第二组规格\n"); printf("100 0.0 0.3 0.7 ---------表示第三组规格\n-------------------------------------\n"); printf("输入:"); scanf("%d",&n); j=0; while(j<n){ scanf("%d",&vnum); scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/ /*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/ dg.generate_data_by_vms(vnum,a,b,htv); printf("累计生成Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total); j++; } break; case 2:/*负载均衡*/ printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n"); printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n"); printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n"); printf("输入样式如:\n"); printf("3 ----------表示3种规格\n"); printf("100 0.0 0.1 0.2 ----------表示第一组规格\n"); printf("30 0.5 0.8 0.9 ----------表示第二组规格\n"); printf("100 0.0 0.3 0.7 ----------表示第三组规格\n------------------------------------\n"); printf("输入:"); scanf("%d",&n); j=0; while(j<n){ scanf("%d",&vnum); /*VM数*/ scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/ /*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/ dg.generate_data_by_vms(vnum,a,b,htv); printf("Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total); j++; } break; case 3:/*热点消除*/ printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n"); printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n"); printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n"); printf("输入样式如:\n"); printf("3 ----------表示3种规格\n"); printf("100 0.0 0.1 0.2 ---------表示第一组规格:0.2是冷点\n"); printf("30 0.5 0.8 0.9 ----------表示第二组规格:0.9是热点必须要有\n"); printf("100 0.0 0.3 0.7 ---------表示第三组规格:0.7是温点\n-------------------------------------\n"); printf("输入:"); scanf("%d",&n); j=0; while(j<n){ scanf("%d",&vnum); /*VM数*/ scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/ /*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/ dg.generate_data_by_vms(vnum,a,b,htv); printf("Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total); j++; } break; case 4:/*冷点整合*/ printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n"); printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n"); printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n"); printf("输入样式如:\n"); printf("1 ----------表示1种规格\n"); printf("100 0.0 0.1 0.2 ---------表示第一组规格,0.2冷点数据\n"); //printf("30 0.5 0.8 0.9 ----------表示第二组规格\n"); //printf("100 0.0 0.3 0.7 ---------表示第三组规格\n"); printf("-------------------------------------\n输入:"); scanf("%d",&n); j=0; while(j<n){ scanf("%d",&vnum); /*VM数*/ scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/ /*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/ dg.generate_data_by_vms(vnum,a,b,htv); printf("Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total); j++; } break; case 0: return; break; } /* printf("请选择调度决策类型:\n1-初始放置;\n2-动态调度:负载均衡;\n"); printf("3-动态调度-热点消除;\n4-动态调度-冷点整合.\n0-退出。\n"); scanf("%d",&sel); */ printf("是否增加空载PM?(输入:1-增加,0-忽略, 回车)\n输入:"); /*清空PM*/ scanf("%d",&sel); if(sel==1) { printf("请输入空载PM数(N)(建议与前面累计生成的PM数一起凑成一个整数,如82,+新输入118=200).\n输入:"); scanf("%d",&pnum); dg.create_empty_pm(pnum); printf("累计total PM:%d.\n",dc.sd->pm_total); } /*2.生成框和组*/ printf("2.生成框吗?每个框PM台数自动生成框的信息(输入:0-跳过,1-继续)\n输入:"); scanf("%d",&choice); if(choice==0) goto cgroup; printf("输入(PM台数):"); scanf("%d",&pnum); //frnum=_gthis->sd->pm_total/vmcount_perfr+1; /*计算所需框的总数*/ dg.create_frame(pnum); printf("成功创建框,累计生成Total Frame:%d:.\n",dc.sd->fr_total); cgroup: printf("3.创建PM分组?(1-创建,0-跳过)\n输入:"); scanf("%d",&choice); if(choice==0) goto crv2v; printf("需要分别创建组及该组的PM数,先输入组个数n,再输入每组的PM数,格式如:\n3\n 5 5 5.\n"); scanf("%d",&grnum); dc.sd->gr_total=0; for(j=0;j<grnum;j++) { scanf("%d",&pnum); dg.create_group(pnum); } printf("成功创建组,累计生成Total groups:%d:.\n",dc.sd->gr_total); /*输出到XML2*/ /*2.将数据保存到XML文件*/ /*Generate XML2*/ strcpy(url,rootdir); strcat(url,"xml2.xml"); dc.constructXML2(url); printf("VMPM模拟数据创建成功,请查看XML文件:%s!\n",url); crv2v: /*3.亲和性*/ printf("4.创建亲和性关系,请选择类型:\n--------------------------------\n"); printf("-3:-反组亲和:在不同组中随机选取两个PM,在其上的VM之间创建;\n"); printf("-2:-反框亲和:在不同框中随机选取两个PM,在其上的VM之间创建;\n"); printf("-1:-反板亲和:随机选取两个PM,在其上的VM之间创建;\n"); printf(" 0:-流量亲和:随机选取PM,在其上的VM之间创建;\n"); printf(" 1:-同板亲和:随机选取一个PM,在其上的VM之间创建;\n"); printf(" 2:-同框亲和:随机选一个框,框中随机选取两个PM,在其上的VM之间创建;\n"); printf(" 3:-同组亲和:随机选取一个组,组中随机选取两个PM,在其上的VM之间创建;\n"); printf("---------------------------------------------------------\n"); printf("请输入类型号:(4-退出):"); scanf("%d",&choice); if(choice>3 || choice <-3) goto outp; init_generator(&dg); dg.sd=&g_sharedata; while(choice>=-3 && choice <=3) { if(choice==0) { printf("请输入边的数量,及流量大小的范围,如(n a b),\n如,生成10条边,流量0,200mbps之间,则输入10 0 200,\n输入:"); scanf("%d%f%f",&afnum, &a,&b); dg.create_v2v_by_ta(a,b,afnum,choice); printf("成功生成%d条边!累计亲和边总数:%d\n输入(4-退出):",afnum,_gthis->sd->v2v_total); } else { printf("请输入数量,如10,表示创建10条亲和边。\n输入:"); scanf("%d",&afnum); dg.create_v2v_by_ta(0,0,afnum,choice); printf("成功生成%d条边!累计亲和边总数:%d.\n输入(4-退出):",afnum,_gthis->sd->v2v_total); } scanf("%d",&choice); } printf("是否置所有PM为空载(针对初始放置)?(输入1-是,0-忽略)\n输入:"); scanf("%d",&sel); if(sel==1){ dg.set_empty_pm(); /*输出到XML2*/ /*2.将数据保存到XML文件*/ /*Generate XML2*/ strcpy(url,rootdir); strcat(url,"xml2.xml"); dc.constructXML2(url); printf("VMPM模拟数据创建成功,请查看XML文件:%s!\n-------------------------------------\n输入(0-返回):",url); } /*Generate XML22*/ strcpy(url,rootdir); strcat(url,"xml22.xml"); dc.constructXML22(url); printf("模拟数据创建成功,请查看目录%s中的XML文件!\n",url); topo: printf("创建物理机拓扑结构数据?交换机端口数为24,PM有4块网口,\n随机生成树形拓扑(1-是,0-忽略)\n输入:"); scanf("%d",&sel); if(sel==1) { printf("输入物理机PM数:(4K即为4096)"); scanf("%d",&emptypmnum); dg.create_p2p_tree_topo(0,1,emptypmnum);/*生成4K个PM的网络拓扑*/ } else return; printf("累计生成交换机总数:%d,\n0层物理机与交换机关系总数:%d,\n交换机之间连接关系总数:%d\n", _gthis->sd->sw_total,_gthis->sd->p2s_total,_gthis->sd->s2s_total); /*Generate XML21*/ strcpy(url,rootdir); strcat(url,"xml21.xml"); dc.constructXML21(url); printf("模拟数据创建成功,请查看目录%s中的XML文件!\n",url); outp: printf("模拟数据生成完毕!(0-返回)\n输入:\n"); }
void set_initial_seed(int ig1, int ig2) /******************************************************************************/ /* Purpose: SET_INITIAL_SEED resets the initial seed and state for all generators. Licensing: This code is distributed under the GNU LGPL license. Modified: 28 March 2013 Author: Original Pascal version by Pierre L'Ecuyer, Serge Cote. C version by John Burkardt. Reference: Pierre LEcuyer, Serge Cote, Implementing a Random Number Package with Splitting Facilities, ACM Transactions on Mathematical Software, Volume 17, Number 1, March 1991, pages 98-111. Parameters: Input, int IG1, IG2, the initial seed values for the first generator. 1 <= IG1 < 2147483563 1 <= IG2 < 2147483399 */ { const int a1_vw = 2082007225; const int a2_vw = 784306273; int g; const int g_max = 32; //int i; const int m1 = 2147483563; const int m2 = 2147483399; int t; if (ig1 < 1 || m1 <= ig1) { fprintf(stderr, "\n"); fprintf(stderr, "SET_INITIAL_SEED - Fatal error!\n"); fprintf(stderr, " Input parameter IG1 out of bounds.\n"); exit(1); } if (ig2 < 1 || m2 <= ig2) { fprintf(stderr, "\n"); fprintf(stderr, "SET_INITIAL_SEED - Fatal error!\n"); fprintf(stderr, " Input parameter IG2 out of bounds.\n"); exit(1); } /* Because INITIALIZE calls SET_INITIAL_SEED, it's not easy to correct the error that arises if SET_INITIAL_SEED is called before INITIALIZE. So don't bother trying. */ if (!initialized_get()) { printf("\n"); printf("SET_INITIAL_SEED - Fatal error!\n"); printf(" The RNGLIB package has not been initialized.\n"); exit(1); } /* Set the initial seed, then initialize the first generator. */ g = 0; cgn_set(g); ig_set(g, ig1, ig2); t = 0; init_generator(t); /* Now do similar operations for the other generators. */ for (g = 1; g < g_max; g++) { cgn_set(g); ig1 = multmod(a1_vw, ig1, m1); ig2 = multmod(a2_vw, ig2, m2); ig_set(g, ig1, ig2); init_generator(t); } /* Now choose the first generator. */ g = 0; cgn_set(g); return; }