Как применить закон Амдала к данному фрагменту кода?

#c #openmp #parallelism-amdahl

#c #openmp #параллелизм-амдал

Вопрос:

У меня есть следующий вопрос в моем задании. Я знаю, что мне нужно использовать закон Амдала, но я не знаю, какая часть будет какой частью в формуле.

Вот в чем вопрос:

How much will the following code speed up if we run it simultaneously on 8 threads?

 #include lt;stdio.hgt;  #include lt;omp.hgt; //OpenMP library   int main()  {   int i=0,j=0;    for (i=0;ilt;1000;i  ){  i*i;  }    #pragma omp parallel for    for (j=0;jlt;2000;j  ){   j*j;  }    return 0;  }   

Любая помощь будет признательна!

Комментарии:

1. Я бы ожидал, что это будет значительно медленнее. Код ничего не делает и, вероятно, может быть оптимизирован до такой степени, что он будет завален накладными расходами::(

2. Я имею в виду, что даже если бы циклы не были оптимизированы, 3000 умножений-это слишком тривиально, чтобы пытаться работать параллельно.

Ответ №1:

Закон Амдала таков:

Закон Амдала

s-это ускорение части задачи, которая выигрывает от улучшения системных ресурсов, а p-это доля времени выполнения, которую первоначально занимала часть, получающая выгоду от улучшения ресурсов.

Ваша программа выполняется за время, пропорциональное 3000, общему числу итераций цикла, если программа выполняется последовательно.

Часть программы, которую вы хотите распараллелить, составляет 2/3 времени выполнения. Поскольку вы планируете запускать его в 8 потоках, ваше теоретическое ускорение для этой части программы составляет 8 раз.

Мы подключаем числа к уравнению:

 1/((1-2/3)   (2/3)/8)  

Это указывает на ограничение ускорения в 2,4 раза.