请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

吾爱极客

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1289|回复: 0

使用并行编程库中的TParallel.For

[复制链接]

271

主题

271

帖子

1129

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1129
发表于 2015-11-5 23:54:16 | 显示全部楼层 |阅读模式

在所有特性中,并行编程库(PPL)包含有一个新的很容易使用的并行for循环。
TParallel.For 在Delphi里接受匿名方法,然而在C++,你要建立一个 Iterator event 函数,然后把它传递到TParallel.For 循环调用成为其一部分。
下面的例子试图演示插入并行循环是多么容易。它特别的展示了怎样用 TParallel.For代替传统循环来找出一个数是否质数。

Delphi:
一个计算质数的函数:

function IsPrime (N: Integer): Boolean;
var
Test: Integer;
begin
IsPrime:= True;
for Test := 2to N - 1 do
   if (N modTest) = 0 then
   begin
     IsPrime := False;
     break; {jumpout of the for loop}
   end;
end;


这是循环检查从1到最大值之间的质数数目的传统方法。 按顺序检查每个数,总数存入一个变量(这里Tot是一个整型变量):


const
Max = 50000; // 50K

for I := 1to Max do
begin
   if IsPrime (I) then
     Inc (Tot);
end;

使用PPL时, 可以这样完成:用类函数 TParallel.For 调用代替for循环,工作代码以匿名方法传入TParallel.For:

TParallel.For(1, Max, procedure(I: Integer)

begin
   if IsPrime (I) then
     TInterlocked.Increment (Tot);
end);


C++:
一个计算质数的函数
bool IsPrime(int N){
        bool aPrime=true;
        for (int Test=2; Test < N-1; Test++) {
                if(N % Test ==0){
                aPrime = false;
                break;
                }
        }
        return aPrime;
}


这是循环检查从1到最大值之间的质数数目的传统方法.按顺序检查每个数,总数存入一个变量(这里Tot是一个整型变量):

int Max=50000;
Tot=0;

for (int I=1; I<=Max; I++) {
        if(IsPrime(I)){
                Tot++;
        }
}

使用PPL时, 可以这样完成:用类函数 TParallel.For 调用代替for循环,工作代码以 iterator event传入TParallel.For。
void __fastcall TFormThreading::MyIteratorEvent(TObject*Sender,int AIndex)
{
        if(IsPrime(AIndex)){
                TInterlocked::Increment(Tot);
        };
}
TParallel::For(NULL,1,Max,MyIteratorEvent);

www.52jike.com (吾爱极客)  ruanzhuo翻译整理,转载请注明出处


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|吾爱极客 ( 粤ICP备15067754号-1  

GMT+8, 2018-11-21 16:54 , Processed in 0.134859 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表