У меня есть два сценария измерения таких показателей, как время вычислений и параллельное ускорение (sequence_time / parallel_time).
Сценарий 1:
Последовательное измерение времени:
startTime=omp_get_wtime();
for loop computation
endTime=omp_get_wtime();
seq_time = endTime-startTime;
Параллельное измерение времени:
startTime = omp_get_wtime();
for loop computation (#pragma omp parallel for reduction (+:pi) private (i)
for (blah blah) {
computation;
}
endTime=omp_get_wtime();
paralleltime = endTime-startTime;
speedup = seq_time/paralleltime;
Сценарий 2:
Последовательное измерение времени:
for loop{
startTime=omp_get_wtime();
computation;
endTime=omp_get_wtime();
seq_time += endTime-startTime;
}
Параллельное измерение времени:
for loop computation (#pragma omp parallel for reduction (+:pi, paralleltime) private (i,startTime,endTime)
for (blah blah) {
startTime=omp_get_wtime();
computation;
endTime=omp_get_wtime();
paralleltime = endTime-startTime;
}
speedup = seq_time/paralleltime;
Я знаю, что Сценарий 2 НЕ лучший производственный код, но я думаю, что он измеряет фактическую теоретическую производительность, ВЫЗЫВАЯ накладные расходы, связанные с созданием openmp и управлением (переключение контекста потока) несколькими потоками. Так что это даст нам линейное ускорение. Но в сценарии 1 учитываются накладные расходы, связанные с созданием потоков и управлением ими.
Я сомневаюсь в следующем: В сценарии 1 я получаю ускорение, которое начинается линейно, но постепенно уменьшается по мере перехода к большему количеству итераций. В сценарии 2 я получаю полное линейное ускорение независимо от количества итераций. Мне сказали, что на самом деле сценарий 1 даст мне линейное ускорение независимо от количества итераций. Но я думаю, что этого не произойдет из-за большой перегрузки из-за управления потоками. Может кто-нибудь объяснить мне, почему я ошибаюсь?
Спасибо! И извините за довольно длинный пост.