Я пытаюсь получить среднюю скорость MFLOPS / S на протяжении многих итераций для функции cblas_dgemm из инфраструктуры Accelerate Mac OS X. Это код, который я использую (он вызывает cblas_dgemm через указатель функции afp):
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);
}
Код обычно запускает умножение двух матриц 1000×1000. Моя проблема в том, что последовательные моменты времени этого кода крайне ненадежны; даже когда ограничение по времени во внешнем цикле увеличивается до пяти секунд, конечная скорость варьируется от 20000 до 30000 мфлоп / с. Я на Macbook Pro 2011 с OS X 10.8.2, с четырехъядерным процессором i5 с гиперпоточностью, отключенной с это расширение ядра и никаких приложений, кроме терминала, когда я бенчмарк. У кого-нибудь есть предложения, как получить более стабильные тайминги?
Есть некоторые недостатки, которые вы не контролировали.
Данный процессор имеет турбо-режимы, которые позволяют ему работать быстрее, чем номинальная тактовая частота, если он не ограничен по температуре. Тем не менее, благодаря устойчивому тесту GEMM ядра будут закреплены с почти максимальной арифметической пропускной способностью, что в итоге приведет к тому, что ядра достигнут предела своей тепловой огибающей, а тактовая частота будет снижена до номинальной частоты, а затем и до более медленных частот.
Предполагая, что вы наблюдаете тенденцию к снижению измеряемой производительности, это может быть причиной.
Ответ от Стивена Кэнона, вероятно, правильный. Поэтому продление времени тестирования до получения стабильного ответа, вероятно, является хорошей идеей. Кроме того, ускорение документация имеет некоторый код, который они используют для тестирования Mflops, он делает намного больше, чем ваш, поэтому, возможно, вы сможете найти некоторые подсказки относительно других вещей, которые нужно отрегулировать на CPU перед запуском теста