У меня есть два сценария измерения метрик, таких как время вычислений и параллельное ускорение (sequential_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 даст мне линейное ускорение независимо от количества итераций.Но я думаю, что это не из-за высокой перегрузки из-за управления потоками.Может кто-нибудь объяснить мне, почему я не прав?
Спасибо!И извините за довольно длинный пост.