20150326

1. 영어 기사 읽기
1) Enceladus Might Be Methane Hotspot, Scientific American
– Another explanation is that methane locked in primordial ice gets released as the ice melts into the underground ocean. (primordial – 원시의)
2) 30 years of .com, CNN
– Despite its cutesy image, revealed to the country along with a spate of other dot-coms during the 2000 NFL Super Bowl, the company lost $147 million in the first nine months of the year and was dead by November. (cutesy – 요염을 떠는)


2. Computer Architecture 청강
– Feedback Directed Prefetching에 나오는 prefetcher는 stream prefetcher이며, stream buffer와 다르다. Stream prefetcher는 L2 miss로 training하며, L2 access로 trigger한다. Stream prefetcher를 적용하면 L2 miss가 없어져버리므로 L2 miss로 trigger하지 않음.
– Single core에서는 prefetch가 효과적이지만, multicore에서는 BW가 부족해 정확한 prefetcher가 있어도 악영향을 줄 수 있다.
– Accuracy = (used prefetches / sent prefethces)
– Coverage = (prefetched misses / all misses)
– Timeliness = (on-time prefetches / used prefetches)
– 현재의 prefetcher로는 간접 메모리 접근, 링크드 리스트, 랜덤 패턴 등에 적용할 수 없다.
– 이를 해결하기 위한 prefetcher로 correlation based prefetcher, content-directed prefetcher, precomputation based prefetcher 등이 있음.
– Markov prefetcher는 임의의 접근 패턴을 예측할 수 있다는 장점이 있지만, 테이블 크기가 커져야 한다는 점, timeliness가 부족하다는 점, compulsory miss를 제거할 수 없다는 점이 단점이다.
– LRU를 쓰려면 해당 set 내에서 cache block의 순서를 알아야 하는데, 이것에 오버헤드가 많이 든다. log2(assoc)bits / block 소요.
– 이를 해결하려면 pseudo-LRU를 사용하면 된다. Cache block의 partial order만 기록하는 방식. 하지만 이 때 LRU와 MRU 블록이 틀리게 설정될 수 있다.


3. SPEC CPU 2006 ROI 확인 중
gprofile을 사용해 SPEC CPU 2006의 ROI를 확인할 수 있을 것 같다. 정섭이 형이 알려준 SPEC CPU 2006 ROI를 보며 gprofile 결과를 확인해보니, gprofile을 사용해 SPE CPU 2006 ROI를 확인할 수 있을 것 같다. 지금까지 SPEC CPU의 ROI를 찾는 과정에서 생각하기에, 1) SPEC CPU workload 자체에 대한 이해 (각각이 어떤 역할을 수행하는지), 2) 소스 코드 분석 능력, 3) gprofile 사용 및 분석 능력이 필요한 것 같다.
모든 워크로드에 대해 gmon.out을 생성함. 입력이 여러 개인 경우에는 모든 입력을 대상으로 gmon.out을 생성하지는 않음. 한 워크로드에 대해 ROI는 크게 다르지 않을 것이므로, 입력값을 바꾸는 것이 의미있지 않다고 판단함.

Integer Benchmarks

1) perlbench
A. gprofile 결과 분석
수많은 함수들이 하나의 큰 cycle을 이루고 있으며, 이 cycle이 전체 실행 시간의 98.2%를 차지한다(S_regmatch, Perl_runops_standard…). 그 다음으로 perl_run이 실행 시간의 95.6%를 차지한다. perl_run이 주요 실행 부분인 것 같음. 하지만 perl_run 함수 내부를 정확히 이해하지는 못함. perl_run 함수 내부에서 ROI를 잡으면 될 것 같다.
B. ROI

//perl.c
int
perl_run(pTHXx)
{
    I32 oldscope;
    int ret = 0; 
    dJMPENV;
#ifdef USE_5005THREADS
    dTHX;
#endif

    oldscope = PL_scopestack_ix;
#ifdef VMS
    VMSISH_HUSHED = 0; 
#endif
//ROI
#ifdef PERL_FLEXIBLE_EXCEPTIONS
 redo_body:
    CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);

2) bzip2
A. gprofile 결과 분석
compressStream, default_bzalloc, BZ2_bzWrite, BZ2_bzCompress, BZ2_compressBlock이 60~69% 정도의 실행시간을 차지한다. 결국 가장 핵심이 되는 함수는 compressStream이다. compressStream 함수에서 BZ2_bzWriteOpen, BZ2_bzWriteClose 사이에 있는 while 루프가 핵심인 것 같다.
B. ROI

//bzip2.c
void compressStream ( FILE *stream, FILE *zStream )
#endif
{
   BZFILE* bzf = NULL;
   UChar   ibuf[5000];
   Int32   nIbuf;
   UInt32  nbytes_in_lo32, nbytes_in_hi32;
   UInt32  nbytes_out_lo32, nbytes_out_hi32;
   Int32   bzerr, bzerr_dummy, ret; 

   SET_BINARY_MODE(stream);
   SET_BINARY_MODE(zStream);

   if (ferror(stream)) goto errhandler_io;
   if (ferror(zStream)) goto errhandler_io;

   bzf = BZ2_bzWriteOpen ( &bzerr, zStream, 
                           blockSize100k, verbosity, workFactor );   
   if (bzerr != BZ_OK) goto errhandler;

   if (verbosity >= 2) fprintf ( stderr, "\n" );
//ROI
   while (True) {

      if (myfeof(stream)) break;
      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
      if (ferror(stream)) goto errhandler_io;
      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
      if (bzerr != BZ_OK) goto errhandler;

   }

   BZ2_bzWriteClose64 ( &bzerr, bzf, 0, 
                        &nbytes_in_lo32, &nbytes_in_hi32,
                        &nbytes_out_lo32, &nbytes_out_hi32 );

3) gcc
A. gprofile 결과 분석
여러 개의 함수가 하나의 cycle을 이루며, 이것이 전체 실행 시간의 99.6% 차지함. 그 다음으로 toplev_main 함수가 99.3%의 실행 시간을 차지함. yyparse_1이 96.5%의 실행 시간을 차지함. 따라서 yyparse_1 함수가 ROI가 됨. main에서 toplev_main 호출, toplev_main에서 do_compile 호출, do_compile에서 compile_file 호출, compile_file에서 yyparse 호출.
B. ROI

//toplev.c
static void
compile_file ()                
{ 
  tree globals;                
  
  /* Initialize yet another pass.  */
  
  init_final (main_input_filename);
  init_branch_prob (dump_base_name);
  
  timevar_push (TV_PARSE);     
  
//ROI
  /* Call the parser, which parses the entire file
     (calling rest_of_compilation for each function).  */
  yyparse ();                  
  
  /* In case there were missing block closers,
     get us back to the global binding level.  */
  (*lang_hooks.clear_binding_stack) ();
  
  /* Compilation is now finished except for writing
     what's left of the symbol table output.  */
  
  timevar_pop (TV_PARSE);      
  
  if (flag_syntax_only)        
    return;                    

4) mcf
A. gprofile 결과 분석
global_opt가 실행 시간의 99.5% 차지함. global_opt가 호출하는 primal_net_simplex가 실행 시간의 82.4% 차지함. 따라서 global_opt 함수 내부에서 메인 루틴이 시작한다. global_opt 함수 내부에 while 루프가 있었고, 여기에서 문제를 받아 계속해서 처리하는 듯 하다. global_opt 내부가 ROI이다.
B. ROI

//mcf.c
#ifdef _PROTO_
long global_opt( void )
#else
long global_opt( )
#endif
{
    long new_arcs;
    long residual_nb_it;
    

    new_arcs = -1; 
    residual_nb_it = net.n_trips <= MAX_NB_TRIPS_FOR_SMALL_NET ?
        MAX_NB_ITERATIONS_SMALL_NET : MAX_NB_ITERATIONS_LARGE_NET;
//ROI
    while( new_arcs )
    {   
#ifdef REPORT
        printf( "active arcs                : %ld\n", net.m );
#endif

        primal_net_simplex( &net );

Advertisements
Tagged with: , , , , , , , , , , , , , , , , , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 98,563 hits
%d bloggers like this: