Ejemplo n.º 1
0
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);

}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
/*功能:生成模拟数据 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");
}
Ejemplo n.º 4
0
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;
}