Parallel Programming-Paralle.For && ForEach
本文主要介绍Parallel.For以及Parallel.ForEach。Parallel.For是普通步长为1的for循环的并行代替方案。Parallel.ForEach是以集合为基准进行循环的foreach的并行代替方案。主要以下内容:
- 使用例子
- 如何退出并行循环
- Break、Stop详细介绍
- Partitioner
一、Parallel.For
1.1 使用例子
class ParallelFor
{
private void Action(int index)
{
Console.WriteLine(index);
Thread.Sleep(1000);
}
public void ParallelAction()
{
Parallel.For(0, 10, (i) => Action(i));
}
} class Program
{
static void Main(string[] args)
{
var stopwatch = Stopwatch.StartNew();
stopwatch.Start();
new ParallelFor().ParallelAction();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.Read();
}
}
1.2 运行截图
时间有很大的提升。
二、跳出循环:Break vs Stop
串行执行的for可以使用break/Stop关键字直接退出循环。Parallel.For可以通过loopState进行退出或者停止循环。
class ParallelFor
{
private void Action(int index)
{
Console.WriteLine(index);
Thread.Sleep(1000);
}
public void ParallelAction()
{
Parallel.For(0, 10, (i, loopState) =>
{
if (i == 8)
{
loopState.Break();//loopState.Stop()
}
Action(i);
});
}
}
LoopState是循环体的第一个参数(可选),第一个是i。
三、 Break和Stop的区别
当Break执行时,小于当前的index(i)的操作都会保证执行完成,大于当前index的迭代不再开始(不是不再执行)-》已经开始的还是会继续执行。
Break indicates that no iterations after the current iteration should be run. It effectively cancels any additional iterations of the loop. However, it does not stop any iterations that have already begun execution.
进一步说明:当index为8的循环开始执行时,index为1,2,3的循环不一定已经开始了。所以当Break执行后(index为8),会保证没有执行的1,2,3执行完毕
比如上面的例子i==8时,进行break,上面的代码执行截图:
0-7保证执行,8也打印出来了(有可能还会有10,9),是因为index8对应的循环在break之前已经开始了。
当Stop执行时,Parallel会用最快的速度结束循环,如果小于当前执行stop的index对应的循环操作还没有开始,则不会执行这些没有开始的。所以Stop比Break能够更加快速的结束迭代。
Calling the Stop method indicates that any iterations of the loop that have not yet started need not be run. It effectively cancels any additional iterations of the loop. However, it does not stop any iterations that have already begun execution.
Calling the Stop method causes the IsStopped property to return true for any iteration of the loop that is still executing. This is particularly useful for long-running iterations, which can check the IsStopped property and exit early if its value is true.
Stop is typically employed in search-based algorithms, where once a result is found, no other iterations need be executed.
Break和Stop不能同时使用,会有异常抛出。
四、Continue功能。
Parallel.For是没有Continue关键字的,简单的使用Return即可完成Continue的功能。
public void ParallelAction()
{
Parallel.For(, , (i) =>
{
if (i == )
{
return;
}
Action(i);
});
}
五、ParallelOptions
Parallel.For通用有ParallelOptions这个属性,通过这个可以指定CancellationSourceToken和MaxDegreeOfParallelism(最大并发数)
public void ParallelAction()
{
var cts = new CancellationTokenSource();
var option = new ParallelOptions()
{
CancellationToken = cts.Token,
MaxDegreeOfParallelism = 5
};
Parallel.For(, , option, (i) =>
{
if (cts.Token.IsCancellationRequested)
{
return;
}
Action(i);
});
}
六、Partitioner
本文一直在讲解Parallel.For上面的操作对于Parallel.ForEach都是通用的。但是Parallel.ForEach有个特殊功能。Partitioner。
6.1 例子
class ParallelForEach
{
public void ParallelAction()
{
int[] items = new int[];
Parallel.ForEach(Partitioner.Create(0, 100000, 50000), (range) =>
{
Console.WriteLine("IN Parallel");
for (var i = range.Item1; i < range.Item2; i++)
{
items[i] = i;
}
});
}
}
上面代码的把1000000次分成两个50000进行,这两个50000之间是并行执行的,但是在每个50000(range)是串行自己执行的。上面程序会打印出两"IN Parallel"。
6.2说明
为什么要使用Partitioner?使用并行开发有两大开销,一是线程调度,二是调度代理方法,如果循环体本身开销很小,大量使用线程会得不偿失:调度本身的开销大于使用并行带来的性能提升。上面的例子可以看出,使用Partitioner减少了并行的次数,增大了循环体的体积。达到了并行和调度开销的协调。
Parallel Programming-Paralle.For && ForEach的更多相关文章
- Notes of Principles of Parallel Programming - TODO
0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...
- 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)
首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...
- Task Cancellation: Parallel Programming
http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...
- Samples for Parallel Programming with the .NET Framework
The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...
- Parallel Programming for FPGAs 学习笔记(1)
Parallel Programming for FPGAs 学习笔记(1)
- Parallel Programming AND Asynchronous Programming
https://blogs.oracle.com/dave/ Java Memory Model...and the pragmatics of itAleksey Shipilevaleksey.s ...
- Introduction to Multi-Threaded, Multi-Core and Parallel Programming concepts
https://katyscode.wordpress.com/2013/05/17/introduction-to-multi-threaded-multi-core-and-parallel-pr ...
- Fork and Join: Java Can Excel at Painless Parallel Programming Too!---转
原文地址:http://www.oracle.com/technetwork/articles/java/fork-join-422606.html Multicore processors are ...
- A Pattern Language for Parallel Programming
The pattern language is organized into four design spaces. Generally one starts at the top in the F ...
- parallel programming. this causual litery nots represents my recent progress in parallel programming in c#.It`s interesting.
not to say extra words,let`s start the code. pasted below: using System; using System.Collections.Ge ...
随机推荐
- devexpress gridcontrol如何遍历每一行
List<Medicine> medicinelist = new List<Medicine>(); foreach (GridViewRow row in GridView ...
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2489 解决:742 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小. ...
- 算法设计 mac 字符串 标识 n维度 2 3维度 字符串 标识值 特征值
基向量
- (转)FMS3.5的安装使用及下载地址
一.下载及安装 FlashMediaServer3.5官方下载地址:http://download.macromedia.com/pub/flashmediaserver/updates/3_5_2/ ...
- 关于js中undefined的判断
在开发中遇到一个情景,当添加用户的时候不需要传入用户id,如果是修改那么需要传入id,因为用的是angular框架,参数是早就定义好了的,那么在新增用户的时候就会出现undefined的情况,之前我一 ...
- ggplot2绘图系统
ggplot2包实现了一个在R中基于全面一致的语法创建图形时的系统 .在ggplot2中,图是采用串联起来(+)号函数创建的.详细内容参见<ggplot2:数据分析与图形艺术>,这里只简要 ...
- shell 批量创建_备份 mysql 数据库 表
#!/bin/bash user=root password= socket=/var/lib/mysql/mysql.sock mycmd="mysql -u$user -p$passwo ...
- 剪辑的楼天城的ACM之路
楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年 ...
- OJ 之 FATE
- FATE Crawling in process... Crawling failed Time Limit:100 ...
- Windows下Nginx的启动、停止等命令添加
Windows下Nginx的启动.停止等命令在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍.1.启动 ...