Sky*_*Sky 1 delphi parallel-processing
能否举一个并行编程的简单例子?
我有一个很大的for loop,我想更快地处理它并使用所有的CPU核心.我能做什么?这与Parallel有关吗?
例如:(计算Pi数字)
var
A: array of LongInt;
I, J, K, P, Q, X, Nines, Predigit: Integer;
NumDigits,PiLength: Integer;
answer : string;
begin
NumDigits := 5000;
SetLength(A, 10*NumDigits div 3);
SetLength(answer, NumDigits+1);
PiLength := 1;
for I := Low(A) to High(A) do
A[I] := 2;
Nines := 0;
Predigit := 0;
for J := 0 to NumDigits-1 do //This loop
begin
Q := 0;
P := 2 * High(A) + 1;
for I := High(A) downto Low(A) do
begin
X := 10*A[I] + Q*(I+1);
A[I] := X mod P;
Q := X div P;
P := P - 2;
end;
A[Low(A)] := Q mod 10;
Q := Q div 10;
if Q = 9 then
Inc(Nines)
else if Q = 10 then
begin
answer[PiLength] := Chr(Predigit + 1 + Ord('0'));
for K := 1 to Nines do
answer[PiLength+K] := '0';
PiLength := PiLength + Nines + 1;
Predigit := 0;
Nines := 0;
end
else
begin
answer[PiLength] := Chr(Predigit + Ord('0'));
Predigit := Q;
for K := 1 to Nines do
answer[PiLength+K] := '9';
PiLength := PiLength + Nines + 1;
Nines := 0;
end;
end;
answer[PiLength] := Chr(Predigit + Ord('0'));
end;
Run Code Online (Sandbox Code Playgroud)
此代码仅使用一个CPU核心.当然因为它是一个线程.当我只有一个主线程时,如何使用所有CPU内核?
更新: 如果您认为此代码无法并行运行.然后看这个例子:
var
i , a : integer;
Begin
a := 0;
for i := 0 to 100000 do
begin
a := a + 1;
end;
end;
Run Code Online (Sandbox Code Playgroud)
您的算法在连续迭代之间具有很强的依赖性.这种依赖关系最容易在数组中看到A[].这意味着您无法并行执行问题中的for循环.I-1在开始迭代之前,您需要知道迭代的结果I.除了明显的依赖性之外A[],还有其他人可能存在.
可以想象,您可以重新使用算法来分解这些依赖关系.然而,也可以想象该算法根本不适合并行执行.以并行方式表达算法是完全正常的.您需要详细研究此算法,以确定它是否可以以并行形式重新投射.
有许多不同的算法用于计算π.由于并行处理的明显潜力,所有对π数字提取的现代研究肯定会采用并行算法.我确信网络搜索将揭示大量适合并行执行的算法.
| 归档时间: |
|
| 查看次数: |
1056 次 |
| 最近记录: |