This repository has been archived on 2024-12-25. You can view files and clone it, but cannot push or open issues or pull requests.
OldPascalProjects/OMPSamples/SumOfPrime.pas
2024-03-10 20:32:51 +03:00

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.