Параллельное ускорение с помощью OpenMP

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

Спасибо! И извините за довольно длинный пост.

5
задан evnu 28 October 2011 в 15:26
поделиться