나는 가속 맥 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으로 해제했으며 벤치 마크 할 때 터미널을 제외한 다른 응용 프로그램은 실행하지 않습니다. 더 안정적인 타이밍을 얻는 방법에 대한 제안이있는 사람이 있습니까?
'read_timer() 란 무엇입니까? 믿을만합니까? 벽시계와 비교해 보셨습니까? –
죄송합니다. 편집에 추가되었습니다. gettimeofday()가 테스트 한 ctime 및 OpenMP 벽시계보다 정확했습니다. –