2012-03-27 3 views
1

Я пытаюсь измерить, как gcc-потоки выполняются в моей системе. Я написал несколько очень простой код измерения, который является чем-то вроде этого ...Профилирование потоков C++ с часами()

start = clock(); 
for(int i=0; i < thread_iters; i++) { 
    pthread_mutex_lock(dataMutex); 
    data++; 
    pthread_mutex_unlock(dataMutex); 
} 
end = clock(); 

я делаю обычное вычитание и DIV на CLOCKS_PER_SEC, чтобы получить истекшее время около 2 секунд для 100000000 итераций. Затем я немного изменяю код профилирования, поэтому я измеряю индивидуальное время для каждого вызова mutex_lock/unlock.

for(int i=0; i < thread_iters; i++) { 
    start1 = clock(); 
    pthread_mutex_lock(dataMutex); 
    end1 = clock(); 
    lock_time+=(end1-start1); 

    data++; 

    start2 = clock(); 
    pthread_mutex_unlock(dataMutex); 
    end2 = clock(); 
    unlock_time+=(end2-start2) 
} 

Времен, которые я получаю за то же число итераций являются блокировки: ~ 27 секунд разблокировать: ~ 27 секунд

Я понимаю, почему общее время программы возрастает, больше вызовов таймера в петля. Но время для системных вызовов должно составлять менее 2 секунд. Может кто-нибудь помочь мне выяснить, где я ошибся? Благодаря!

+0

На какой платформе вы работаете? –

ответ

3

Звонки clock также измеряют время, необходимое для звонка clock и возврата от него. Это вводит смещение в измерение. То есть где-то глубоко внутри функции clock требуется образец. Но затем перед запуском вашего кода он должен вернуться из глубины clock. И затем, когда вы берете окончательное измерение, до , что можно сделать выборку времени, clock должен быть вызван, и управление должно проходить где-то глубоко внутри этой функции, где оно фактически получает время. Таким образом, вы включаете все эти накладные расходы в качестве части измерения.

Вы должны узнать, сколько времени проходит между последовательными звонками clock (путем взятия некоторых выборок по многим парам звонков clock, чтобы получить точный средний показатель). Это дает вам базовый уклон: сколько времени требуется, чтобы ничего не выполнять между двумя часовыми образцами. Затем вы тщательно вычитаете свой уклон из измерений.

Но звонки в clock могут помешать работе, так что вы не получите точный ответ. Вызовы ядру для получения часов нарушают ваш кеш L1 и кеш команд. Для мелкозернистых измерений, подобных этому, лучше опуститься на встроенную сборку и прочитать регистр подсчета циклов от CPU.

clock Лучше всего использовать его в первом примере: взять образцы вокруг чего-то, что выполняется для многих итераций, а затем разделить на число итераций, чтобы оценить одноисточное время.

Смежные вопросы