44 lines
1 KiB
ObjectPascal
44 lines
1 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. |