能否举一个并行编程的简单例子?
我有一个很大的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;
此代码仅使用一个CPU核心.当然因为它是一个线程.当我只有一个主线程时,如何使用所有CPU内核?
更新: 如果您认为此代码无法并行运行.然后看这个例子:
var i , a : integer; Begin a := 0; for i := 0 to 100000 do begin a := a + 1; end; end;
David Heffer.. 5
您的算法在连续迭代之间具有很强的依赖性.这种依赖关系最容易在数组中看到A[]
.这意味着您无法并行执行问题中的for循环.I-1
在开始迭代之前,您需要知道迭代的结果I
.除了明显的依赖性之外A[]
,还有其他人可能存在.
可以想象,您可以重新使用算法来分解这些依赖关系.然而,也可以想象该算法根本不适合并行执行.以并行方式表达算法是完全正常的.您需要详细研究此算法,以确定它是否可以以并行形式重新投射.
有许多不同的算法用于计算π.由于并行处理的明显潜力,所有对π数字提取的现代研究肯定会采用并行算法.我确信网络搜索将揭示大量适合并行执行的算法.
您的算法在连续迭代之间具有很强的依赖性.这种依赖关系最容易在数组中看到A[]
.这意味着您无法并行执行问题中的for循环.I-1
在开始迭代之前,您需要知道迭代的结果I
.除了明显的依赖性之外A[]
,还有其他人可能存在.
可以想象,您可以重新使用算法来分解这些依赖关系.然而,也可以想象该算法根本不适合并行执行.以并行方式表达算法是完全正常的.您需要详细研究此算法,以确定它是否可以以并行形式重新投射.
有许多不同的算法用于计算π.由于并行处理的明显潜力,所有对π数字提取的现代研究肯定会采用并行算法.我确信网络搜索将揭示大量适合并行执行的算法.