Esempio n. 1
0
main()
{

	int a, attr, x = 0;
	struct LIST_OF_OBJ *list_of_obj, *tmp_list_of_obj;
	struct LIST_OF_OBJ_OPTIMIZED	 *list_of_obj_optimized,
									 *tmp_list_of_obj_optimized;

	//TITLE
	PRINT("= = = демонстраци¤ пагубного вли¤ни¤ страничной организации пам¤ти = = =\n");
	PRINT_TITLE;

	/* -----------------------------------------------------------------------
	 *
	 *						обработка классического списка
	 *
	------------------------------------------------------------------------ */
	// выделение пам¤ти
	list_of_obj = (struct LIST_OF_OBJ*)
		_malloc32(N_ELEM*sizeof(struct LIST_OF_OBJ));
	
	// иницилизаци¤ списка
	for (a = 0; a < N_ELEM; a++)
		list_of_obj[a].next = list_of_obj + a + 1;
		list_of_obj[N_ELEM-1].next = 0;
	
	// трассировка списка
	AL_BEGIN;
		CLEAR_L2_CACHE();
		L_BEGIN(0)
			tmp_list_of_obj = list_of_obj;
			do{
				for(attr = 0; attr < ATTR_SIZE; attr++)
					x += tmp_list_of_obj[0].obj_attr[attr];
			} while(tmp_list_of_obj = tmp_list_of_obj[0].next);
		L_END(0)
	AL_END;
	L1_OUT("CLASSIC   ");


	/* ----------------------------------------------------------------------
	 *
	 *			обработка оптимизированного раздельного списка
	 *
	----------------------------------------------------------------------- */
	// выделение пам¤ти
	list_of_obj_optimized = (struct LIST_OF_OBJ_OPTIMIZED*)
					_malloc32(N_ELEM*sizeof(struct LIST_OF_OBJ_OPTIMIZED));

	// иницилизаци¤ списка
	for (a = 0; a < N_ELEM ;a++)
	{
		list_of_obj_optimized[a].next = list_of_obj_optimized + a + 1;
		
		#ifdef PESSIMIZE
			list_of_obj_optimized[a].obj_attr = malloc(sizeof(int)*ATTR_SIZE);
			// printf("*%X\n",list_of_obj_optimized[a].obj_attr);
		#endif
		
		list_of_obj_optimized[a].obj_body = malloc(sizeof(int)*BODY_SIZE);
	}	list_of_obj_optimized[N_ELEM-1].next = 0;

	// трассировка списка
	AL_BEGIN;
		CLEAR_L2_CACHE();
		L_BEGIN(1)
			tmp_list_of_obj_optimized=list_of_obj_optimized;
			do{
				for(attr=0;attr<ATTR_SIZE;attr++)
					x+=tmp_list_of_obj_optimized[0].obj_attr[attr];

			} while(tmp_list_of_obj_optimized
								= tmp_list_of_obj_optimized[0].next);
		L_END(1)
	AL_END;
	Lx_OUT("OPTIMIZED ",Ax_GET(0),Ax_GET(1));
}
Esempio n. 2
0
main()
{
	int *p1,*p2;
	float x = 0;
	int a, b, per, z = 1;

	// выделение пам¤ти
	p1 = (int *) _malloc32(BLOCK_SIZE);
	p2 = (int *) _malloc32(BLOCK_SIZE);

	// TITLE
	PRINT("= = = демонстраци¤ совмещени¤ вычислений с доступом к пам¤ти = = =\n");
	PRINT_TITLE;

	/* -----------------------------------------------------------------------
	 *
	 *			cовмещение вычислений x+=cos(x) с чтением пам¤ти
	 *
	------------------------------------------------------------------------ */
	printf("### x+=cos(x) ###\n");
	
	// 1:4
	per=4; VVV;
	A_BEGIN(0)
		for(a = 0; a < BLOCK_SIZE; a += 4)
			z += *(int*)((char *)p1+a);

		for(a = 0; a < (BLOCK_SIZE/per); a++)
			x+=cos(x);
	A_END(0)

	VVV;
	A_BEGIN(1)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		z += *(int*)((char *)p1+a);
		x+=cos(x);
	}
	A_END(1)

	per=8;VVV;
	A_BEGIN(2)
		for(a = 0; a < BLOCK_SIZE; a+=4)
			z += *(int*)((char *)p1+a);

		for(a=0; a < (BLOCK_SIZE/per); a++)
		 x+=cos(x);
	A_END(2)

	VVV;
	A_BEGIN(3)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		
			z += *(int*)((char *)p1 + a);
			z += *(int*)((char *)p1 + a + 4);

		x+=cos(x);
	}
	A_END(3)


	per=16;VVV;
	A_BEGIN(4)
		for(a = 0; a < BLOCK_SIZE; a+=4)
			z += *(int*)((char *)p1+a);

		for(a=0; a < (BLOCK_SIZE/per); a++)
		 x+=cos(x);
	A_END(4)

	VVV;
	A_BEGIN(5)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		z += *(int*)((char *)p1 + a);
		z += *(int*)((char *)p1 + a + 4);
		z += *(int*)((char *)p1 + a + 8);
		z += *(int*)((char *)p1 + a + 12);
		x+=cos(x);
	}
	A_END(5)

	per=32;VVV;
	A_BEGIN(6)
		for(a = 0; a < BLOCK_SIZE; a+=4)
			z += *(int*)((char *)p1+a);
		
		for(a=0; a < (BLOCK_SIZE/per); a++)
			x+=cos(x);
	A_END(6)

	VVV;
	A_BEGIN(7)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		z += *(int*)((char *)p1 + a);
		z += *(int*)((char *)p1 + a + 4);
		z += *(int*)((char *)p1 + a + 8);
		z += *(int*)((char *)p1 + a + 12);
		z += *(int*)((char *)p1 + a + 16);
		z += *(int*)((char *)p1 + a + 20);
		z += *(int*)((char *)p1 + a + 24);
		z += *(int*)((char *)p1 + a + 28);

		x+=cos(x);
	}
	A_END(7)


	per=64;VVV;
	A_BEGIN(8)
		for(a = 0; a < BLOCK_SIZE; a+=4)
			z += *(int*)((char *)p1 + a);

		for(a=0; a < (BLOCK_SIZE/per); a++)
		 x+=cos(x);
	A_END(8)

	VVV;
	A_BEGIN(9)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		z += *(int*)((char *)p1 + a);
		z += *(int*)((char *)p1 + a + 4);
		z += *(int*)((char *)p1 + a + 8);
		z += *(int*)((char *)p1 + a + 12);
		z += *(int*)((char *)p1 + a + 16);
		z += *(int*)((char *)p1 + a + 20);
		z += *(int*)((char *)p1 + a + 24);
		z += *(int*)((char *)p1 + a + 28);

		z += *(int*)((char *)p1 + a + 32);
		z += *(int*)((char *)p1 + a + 36);
		z += *(int*)((char *)p1 + a + 40);
		z += *(int*)((char *)p1 + a + 44);
		z += *(int*)((char *)p1 + a + 48);
		z += *(int*)((char *)p1 + a + 52);
		z += *(int*)((char *)p1 + a + 56);
		z += *(int*)((char *)p1 + a + 60);

		x+=cos(x);
	}
	A_END(9)

	Lx_OUT(" 1:4  ",Ax_GET(0),Ax_GET(1));
	Lx_OUT(" 1:8  ",Ax_GET(2),Ax_GET(3));
	Lx_OUT(" 1:16 ",Ax_GET(4),Ax_GET(5));
	Lx_OUT(" 1:32 ",Ax_GET(6),Ax_GET(7));
	Lx_OUT(" 1:64 ",Ax_GET(8),Ax_GET(9));


	per=128;VVV;
	A_BEGIN(0)
		for(a = 0; a < BLOCK_SIZE; a+=4)
			z += *(int*)((char *)p1 + a);

		for(a=0; a < (BLOCK_SIZE/per); a++)
		 x+=cos(x);
	A_END(0)

	VVV;
	A_BEGIN(1)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		z += *(int*)((char *)p1 + a);
		z += *(int*)((char *)p1 + a + 4);
		z += *(int*)((char *)p1 + a + 8);
		z += *(int*)((char *)p1 + a + 12);
		z += *(int*)((char *)p1 + a + 16);
		z += *(int*)((char *)p1 + a + 20);
		z += *(int*)((char *)p1 + a + 24);
		z += *(int*)((char *)p1 + a + 28);

		z += *(int*)((char *)p1 + a + 32);
		z += *(int*)((char *)p1 + a + 36);
		z += *(int*)((char *)p1 + a + 40);
		z += *(int*)((char *)p1 + a + 44);
		z += *(int*)((char *)p1 + a + 48);
		z += *(int*)((char *)p1 + a + 52);
		z += *(int*)((char *)p1 + a + 56);
		z += *(int*)((char *)p1 + a + 60);

		z += *(int*)((char *)p1 + a + 64);
		z += *(int*)((char *)p1 + a + 68);
		z += *(int*)((char *)p1 + a + 72);
		z += *(int*)((char *)p1 + a + 76);
		z += *(int*)((char *)p1 + a + 80);
		z += *(int*)((char *)p1 + a + 84);
		z += *(int*)((char *)p1 + a + 88);
		z += *(int*)((char *)p1 + a + 92);

		z += *(int*)((char *)p1 + a + 96);
		z += *(int*)((char *)p1 + a + 100);
		z += *(int*)((char *)p1 + a + 104);
		z += *(int*)((char *)p1 + a + 108);
		z += *(int*)((char *)p1 + a + 112);
		z += *(int*)((char *)p1 + a + 116);
		z += *(int*)((char *)p1 + a + 120);
		z += *(int*)((char *)p1 + a + 124);

		x+=cos(x);
	}
	A_END(1)

	per=256;VVV;
	A_BEGIN(2)
		for(a = 0; a < BLOCK_SIZE; a+=4)
			z += *(int*)((char *)p1 + a);

		for(a=0; a < (BLOCK_SIZE/per); a++)
		 x+=cos(x);
	A_END(2)

	VVV;
	A_BEGIN(3)
	for(a = 0; a < BLOCK_SIZE; a += per)
	{
		z += *(int*)((char *)p1 + a);
		z += *(int*)((char *)p1 + a + 4);
		z += *(int*)((char *)p1 + a + 8);
		z += *(int*)((char *)p1 + a + 12);
		z += *(int*)((char *)p1 + a + 16);
		z += *(int*)((char *)p1 + a + 20);
		z += *(int*)((char *)p1 + a + 24);
		z += *(int*)((char *)p1 + a + 28);

		z += *(int*)((char *)p1 + a + 32);
		z += *(int*)((char *)p1 + a + 36);
		z += *(int*)((char *)p1 + a + 40);
		z += *(int*)((char *)p1 + a + 44);
		z += *(int*)((char *)p1 + a + 48);
		z += *(int*)((char *)p1 + a + 52);
		z += *(int*)((char *)p1 + a + 56);
		z += *(int*)((char *)p1 + a + 60);

		z += *(int*)((char *)p1 + a + 64);
		z += *(int*)((char *)p1 + a + 68);
		z += *(int*)((char *)p1 + a + 72);
		z += *(int*)((char *)p1 + a + 76);
		z += *(int*)((char *)p1 + a + 80);
		z += *(int*)((char *)p1 + a + 84);
		z += *(int*)((char *)p1 + a + 88);
		z += *(int*)((char *)p1 + a + 92);

		z += *(int*)((char *)p1 + a + 96);
		z += *(int*)((char *)p1 + a + 100);
		z += *(int*)((char *)p1 + a + 104);
		z += *(int*)((char *)p1 + a + 108);
		z += *(int*)((char *)p1 + a + 112);
		z += *(int*)((char *)p1 + a + 116);
		z += *(int*)((char *)p1 + a + 120);
		z += *(int*)((char *)p1 + a + 124);

		z += *(int*)((char *)p1 + a + 128);
		z += *(int*)((char *)p1 + a + 132);
		z += *(int*)((char *)p1 + a + 136);
		z += *(int*)((char *)p1 + a + 140);
		z += *(int*)((char *)p1 + a + 144);
		z += *(int*)((char *)p1 + a + 148);
		z += *(int*)((char *)p1 + a + 152);
		z += *(int*)((char *)p1 + a + 156);

		z += *(int*)((char *)p1 + a + 160);
		z += *(int*)((char *)p1 + a + 164);
		z += *(int*)((char *)p1 + a + 168);
		z += *(int*)((char *)p1 + a + 172);
		z += *(int*)((char *)p1 + a + 176);
		z += *(int*)((char *)p1 + a + 180);
		z += *(int*)((char *)p1 + a + 184);
		z += *(int*)((char *)p1 + a + 188);

		z += *(int*)((char *)p1 + a + 192);
		z += *(int*)((char *)p1 + a + 196);
		z += *(int*)((char *)p1 + a + 200);
		z += *(int*)((char *)p1 + a + 204);
		z += *(int*)((char *)p1 + a + 208);
		z += *(int*)((char *)p1 + a + 212);
		z += *(int*)((char *)p1 + a + 216);
		z += *(int*)((char *)p1 + a + 220);

		z += *(int*)((char *)p1 + a + 224);
		z += *(int*)((char *)p1 + a + 228);
		z += *(int*)((char *)p1 + a + 232);
		z += *(int*)((char *)p1 + a + 236);
		z += *(int*)((char *)p1 + a + 240);
		z += *(int*)((char *)p1 + a + 244);
		z += *(int*)((char *)p1 + a + 248);
		z += *(int*)((char *)p1 + a + 252);


		x+=cos(x);
	}
	A_END(3)

	VVV;
	A_BEGIN(4)
		// комбинирование вычислений с доступом к пам¤ти
		// без разворота цикла
		for(a = 0; a < BLOCK_SIZE; a += per)
		{
			for(b = 0; b < per; b += 4)
				z += *(int*)((char *)p1 + a + b);

			x+=cos(x);
		}
	A_END(4)

	// вывод результатов (окончание)
	Lx_OUT(" 1:128",Ax_GET(0),Ax_GET(1));
	Lx_OUT(" 1:256",Ax_GET(2),Ax_GET(3));
	Lx_OUT("*1:256",Ax_GET(2),Ax_GET(3));

	printf("##################\n\n");

return x+z;
}
Esempio n. 3
0
int
__main (void *progxfer, void *cli_util, void *imghdr, void *image_file_desc,
	unsigned int linkflag, unsigned int cliflag)
{
  int argc;
  int argv;
  int envp;
  int status;
  char **argv64;
  char **envp64;
  unsigned int flags = (unsigned __int64)&__gcc_main_flags;

  /* The argv and envp arrays are 32 bits pointers to 32 bits pointers.  */
  decc$main (progxfer, cli_util, imghdr, image_file_desc,
	     linkflag, cliflag, &argc, &argv, &envp);

  if (flags & MAIN_FLAG_64BIT)
    {
      int i;

      /* Reallocate argv and envp with 64 bit pointers.  */
      argv64 = (char **) _malloc32 (sizeof (char *) * (argc + 1));

      for (i = 0; i < argc; i++)
        argv64[i] = (char *) (__int64)(((int *) (__int64) argv)[i]);

      argv64[argc] = NULL;

      for (i = 0; ((int *) (__int64) envp)[i]; i++)
        ;
      envp64 = (char **) _malloc32 (sizeof (char *) * (i + 1));

      for (i = 0; ((int *) (__int64) envp)[i]; i++)
        envp64[i] = (char *)(__int64)(((int *) (__int64) envp)[i]);

      envp64[i] = NULL;
    }
  else
    {
      argv64 = (char **)(__int64)argv;
      envp64 = (char **)(__int64)envp;
    }

  status = main (argc, argv64, envp64);

  if (flags & MAIN_FLAG_POSIX)
    {
      /* Map into a range of 0 - 255.  */
      status &= 255;

      if (status != 0)
	{
	  int save_status = status;

	  status = (__int64) &C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);

	  /* An exit failure status requires a "severe" error.  All
	     status values are defined in errno with a successful (1)
	     severity but can be changed to an error (2) severity by
	     adding 1.  In addition for compatibility with UNIX exit()
	     routines we inhibit a run-time error message from being
	     generated on exit(1).  */

	  if (save_status == 1)
	    {
	      status++;
	      status |= STS$M_INHIB_MSG;
	    }
	}
      else
	status = SS$_NORMAL;
    }

  return status;
}