2012-12-14 5 views
0

나는 가속 맥 OS X의 프레임 워크에서 cblas_dgemm 기능에 대한 많은 반복을 통해 평균 MFLOPS/S의 속도를 얻기 위해 시도하고있다. 이것은 내가 사용하고있는 코드입니다 (이 함수 포인터 AFP를 통해 cblas_dgemm 호출) :불안정 프로파일 링 타이밍

double benchmark_cblas_matmul(dgemm_fp afp, 
    const CBLAS_ORDER Order, 
    const CBLAS_TRANSPOSE TransA, 
    const CBLAS_TRANSPOSE TransB, 
    const int M, 
    const int N, 
    const int K, 
    const double alpha, 
    const double *A, 
    const int lda, 
    const double *B, 
    const int ldb, 
    const double beta, 
    double *C, 
    const int ldc) 
{ 
    double mflops_s,seconds = -1.0; 
    for(int n_iterations = 1; seconds < 0.1; n_iterations *= 2) 
    { 
     seconds = read_timer(); 
     for(int i = 0; i < n_iterations; ++i) 
     { 
      (*afp)(Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc); 
     } 
     seconds = read_timer() - seconds; 
     mflops_s = (2e-6*n_iterations*N*N*N)/seconds; 
    } 
    return mflops_s; 
} 

타이머 루틴은 다음과 같습니다

double read_timer() 
{ 
    static bool initialized = false; 
    static struct timeval start; 
    struct timeval end; 
    if(!initialized) 
    { 
     gettimeofday(&start, NULL); 
     initialized = true; 
    } 

    gettimeofday(&end, NULL); 

    return (end.tv_sec - start.tv_sec) + 1.0e-6 * (end.tv_usec - start.tv_usec); 
} 

코드는 일반적으로 두 1000x1000 행렬의 곱셈을 실행합니다. 내 문제는이 코드의 연속 된 타이밍이 매우 신뢰할 수 없다는 것입니다. 바깥 쪽 루프의 타이밍 한계가 5 초로 증가하더라도 최종 속도는 20000에서 30000 mflops/s 사이에서 달라집니다. 나는 2011 년 맥북 프로 OS X 10.8.2에서 쿼드 코어 i5와 하이퍼 스레딩을 this kernel extension으로 해제했으며 벤치 마크 할 때 터미널을 제외한 다른 응용 프로그램은 실행하지 않습니다. 더 안정적인 타이밍을 얻는 방법에 대한 제안이있는 사람이 있습니까?

+0

'read_timer() 란 무엇입니까? 믿을만합니까? 벽시계와 비교해 보셨습니까? –

+0

죄송합니다. 편집에 추가되었습니다. gettimeofday()가 테스트 한 ctime 및 OpenMP 벽시계보다 정확했습니다. –

답변

2

통제하지 못한 혼란이 있습니다.

문제의 프로세서는 너무 오래가 열 제한되지 않는 공칭 클럭 속도보다 더 빠르게 실행할 수 있도록 터보 모드가 있습니다. 그러나 지속적인 GEMM 벤치 마크를 실행하면 코어가 거의 최대 산술 처리량으로 고정되어 결국 코어가 열 엔벨로프의 한계에 도달하게되고 클럭이 명목 속도로 줄어들고 느린 속도로 줄어들게됩니다.

당신이 측정 된 성능 하락 추세를보고있는 것으로 가정하면,이 책임을 질 수 있습니다.

+0

의미가 있습니다. i5에서 좋은 벤치 마크를 얻으려는 관행이 있습니까? –

+0

그것은 정말로 당신이 측정하려고하는 것에 달려 있습니다. 벤치마킹만을위한 벤치마킹입니까? 그런 다음 최대 또는 정상 상태 성능을 사용하도록 선택할 수 있습니다. 특정 실제 이익 계산이 어떻게 수행되는지 확인하려고합니까? 그런 다음 계산의 조건을 가능한 한 현실적으로 일치시켜야합니다 (예 : 하이퍼 스레딩을 비활성화하지 않고 다른 작업을 계속 실행하는 것을 포함 할 수 있음) –

0

스티븐 캐논 (Stephen Canon)의 답변이 맞는 것 같습니다. 따라서 안정적인 응답에 도달 할 때까지 테스트 시간을 연장하는 것이 좋습니다. 또한 Accelerate documentation에는 Mflops를 테스트하는 데 사용하는 코드가 있습니다. 테스트를 실행하기 전에 CPU에서 조정할 수있는 다른 것들에 대한 단서를 찾을 수 있습니다.

+0

그 샘플 코드는 모든 PPC- 특정 가벼운 음식; 나는 타이밍의 예로서 그것을 올바르게 사용하지 않을 것이다. 질문에 대한 질문자의 접근 방식은 일반적으로 제정신이 아닙니다. –