# include  "../thneed.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "../../runners/snpemodel.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define TEMPORAL_SIZE 512 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define DESIRE_LEN 8 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define TRAFFIC_CONVENTION_LEN 2 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  hexdump ( uint32_t  * d ,  int  len ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								int  main ( int  argc ,  char *  argv [ ] )  { 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # define OUTPUT_SIZE 0x10000 
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  * output  =  ( float * ) calloc ( OUTPUT_SIZE ,  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  * golden  =  ( float * ) calloc ( OUTPUT_SIZE ,  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  SNPEModel  mdl ( argv [ 1 ] ,  output ,  0 ,  USE_GPU_RUNTIME ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // cmd line test
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( argc  >  2 )  { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( int  i  =  2 ;  i  <  argc ;  i + + )  { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      float  * buf [ 5 ] ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      FILE  * f  =  fopen ( argv [ i ] ,  " rb " ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      size_t  sz ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      for  ( int  j  =  0 ;  j  <  5 ;  j + + )  { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        fread ( & sz ,  1 ,  sizeof ( sz ) ,  f ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        printf ( " reading %zu \n " ,  sz ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        buf [ j ]  =  ( float * ) malloc ( sz ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        fread ( buf [ j ] ,  1 ,  sz ,  f ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  ( sz  ! =  9532 )  continue ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      mdl . addRecurrent ( buf [ 0 ] ,  TEMPORAL_SIZE ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      mdl . addTrafficConvention ( buf [ 1 ] ,  TRAFFIC_CONVENTION_LEN ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      mdl . addDesire ( buf [ 2 ] ,  DESIRE_LEN ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      mdl . execute ( buf [ 3 ] ,  0 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      hexdump ( ( uint32_t * ) buf [ 4 ] ,  0x100 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      hexdump ( ( uint32_t * ) output ,  0x100 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      for  ( int  j  =  0 ;  j  <  sz / 4 ;  j + + )  { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( buf [ 4 ] [ j ]  ! =  output [ j ] )  { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          printf ( " MISMATCH %d real:%f comp:%f \n " ,  j ,  buf [ 4 ] [ j ] ,  output [ j ] ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  state [ TEMPORAL_SIZE ] ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  mdl . addRecurrent ( state ,  TEMPORAL_SIZE ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  desire [ DESIRE_LEN ] ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  mdl . addDesire ( desire ,  DESIRE_LEN ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  traffic_convention [ TRAFFIC_CONVENTION_LEN ] ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  mdl . addTrafficConvention ( traffic_convention ,  TRAFFIC_CONVENTION_LEN ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  * input  =  ( float * ) calloc ( 0x1000000 ,  sizeof ( float ) ) ; ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // first run
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  printf ( " ************** execute 1 ************** \n " ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  memset ( output ,  0 ,  OUTPUT_SIZE  *  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  mdl . execute ( input ,  0 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  hexdump ( ( uint32_t  * ) output ,  0x100 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  memcpy ( golden ,  output ,  OUTPUT_SIZE  *  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // second run
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  printf ( " ************** execute 2 ************** \n " ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  memset ( output ,  0 ,  OUTPUT_SIZE  *  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Thneed  * t  =  new  Thneed ( ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  t - > record  =  7 ;   // debug print with record
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  mdl . execute ( input ,  0 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  t - > stop ( ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  hexdump ( ( uint32_t  * ) output ,  0x100 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  if  ( memcmp ( golden ,  output ,  OUTPUT_SIZE  *  sizeof ( float ) )  ! =  0 )  {  printf ( " FAILURE \n " ) ;  return  - 1 ;  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // third run
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  printf ( " ************** execute 3 ************** \n " ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  memset ( output ,  0 ,  OUTPUT_SIZE  *  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  t - > record  =  2 ;   // debug print w/o record
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  float  * inputs [ 4 ]  =  { state ,  traffic_convention ,  desire ,  input } ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  t - > execute ( inputs ,  output ,  true ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  hexdump ( ( uint32_t  * ) output ,  0x100 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  if  ( memcmp ( golden ,  output ,  OUTPUT_SIZE  *  sizeof ( float ) )  ! =  0 )  {  printf ( " FAILURE \n " ) ;  return  - 1 ;  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  printf ( " ************** execute 4 ************** \n " ) ; 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  while  ( 1 )  { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    memset ( output ,  0 ,  OUTPUT_SIZE  *  sizeof ( float ) ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //t->record = 2;  // debug print w/o record
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    t - > execute ( inputs ,  output ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    hexdump ( ( uint32_t  * ) output ,  0x100 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( memcmp ( golden ,  output ,  OUTPUT_SIZE  *  sizeof ( float ) )  ! =  0 )  {  printf ( " FAILURE \n " ) ;  return  - 1 ;  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    break ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  printf ( " ************** execute done ************** \n " ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}