44 lines
1.2 KiB
ObjectPascal
44 lines
1.2 KiB
ObjectPascal
// Демонстрация работы директивы parallel for c опцией редукции
|
|
// на примере вычисления суммы простых чисел среди первых n
|
|
// натуральных чисел
|
|
|
|
// проверка на простоту числа n
|
|
function IsPrime(n:integer):boolean;
|
|
begin
|
|
result:=false;
|
|
for var i:integer:=2 to round(sqrt(n)) do
|
|
if n mod i = 0 then
|
|
exit;
|
|
result:=true;
|
|
end;
|
|
//Последовательное вычисление суммы простых чисел
|
|
function SumOfPrimesSeq(n:integer):int64;
|
|
begin
|
|
var sum:int64:=0;
|
|
for var i:integer:=2 to n do
|
|
if IsPrime(i) then
|
|
sum:=sum+i;
|
|
result:=sum;
|
|
end;
|
|
//Параллельное вычисление суммы простых чисел
|
|
function SumOfPrimesPar(n:integer):int64;
|
|
begin
|
|
var sum:int64:=0;
|
|
{$omp parallel for reduction(+:sum)}
|
|
for var i:integer:=2 to n do
|
|
if IsPrime(i) then
|
|
sum:=sum+i;
|
|
result:=sum;
|
|
end;
|
|
|
|
const Count = 5000000;
|
|
|
|
begin
|
|
var t := Milliseconds;
|
|
WriteLn(SumOfPrimesSeq(Count));
|
|
Writeln('Seq time = ', Milliseconds - t);
|
|
|
|
t := Milliseconds;
|
|
WriteLn(SumOfPrimesPar(Count));
|
|
Writeln('Par time = ', Milliseconds - t);
|
|
end. |