假设我有一个图表,其中节点是各种工作负载,边缘是工作负载之间的依赖关系.(这是DAG,因为不能存在循环依赖.)
我还有一组可以执行工作的多个代理.
一些工作负载变种可以给予任何代理,其他工作量必须给予特定代理,而其他工作量必须给予特定代理组中的一个代理.
如何分配工作负载,以便:
在完成所有阻塞工作负载之前,不会向代理提供任何工作负载
完成总工作负载图需要最短的时间.(请注意,最小化代理程序空闲时间通常是好的,但不是基本要求 - 可能存在一个特定代理程序闲置的时间更长但是完成所有代理程序中所有作业的总时间最少.)
工作负载具有持续时间估计值,但为简单起见假设每个工作负载需要相同的计算时间.(只需将每个工作负载分解为多个依赖于串行的工作负载,直到每个工作负载实际上都是一个恒定时间操作.)
我知道拓扑DAG排序,但它产生一个单一的序列节点排序.我有多个并行运行的代理,并且这种关系可以通过非显而易见的任务重新排序来实现潜在的大时序优化.
这样的结果将作为最小总持续时间的甘特图得到最佳结果.实际上,如果您将问题视为在团队中的工程师的里程碑中分配错误票据,目标是尽快完成里程碑,那么您就会明白这一点.(不......请不要告诉我将我的图表导入MS Project然后将其导出:) - 我对它背后的算法感兴趣!)
非常感谢知名算法,软件库或一般问题和原则的指针!
我试图执行以下代码,并在尝试将数组值分配给列表时不断获得索引超出范围异常: -
int[] array = new int[1000000];
for (int i = 0; i < array.Length; i++)
{
array[i] = i;
}
List<int> list = new List<int>();
Parallel.For(0, array.Length, i => list.Add(array[i]));
Run Code Online (Sandbox Code Playgroud)
我在这里做错了吗?我知道这个过程是无序/异步的,但为什么"i"得到的值高于"array.Length"的值?
在高性能计算中,总和,产品等通常使用"并行缩减"来计算,该"并行缩减"采用n个元素并在O(log n)时间内完成(给定足够的并行度).在Haskell中,我们通常使用折叠进行此类计算,但评估时间在列表长度中始终是线性的.
Data Parallel Haskell内置了一些内容,但是在列表的通用框架中呢?我们能做到Control.Parallel.Strategies吗?
所以,假设f是关联的,我们如何写
parFold :: (a -> a -> a) -> [a] -> a
那么parFold f xs只需要时间对数length xs吗?
问题陈述:如何在SQL Server中并行化插入(2008)
我正在为C#多线程工作者进行大规模的数值计算,基本上做一件事:在一段时间内(以天为单位)测试数千种可能的配置(矩阵组合)并将结果存储到SQL Server数据库中.
如果我将结果逐个存储到DB中(每个计算会话约300,000行*100个会话),一个接一个地,我最后等待数小时才能结束存储过程.
数据库设计非常简单:
每个"组合集"都针对样本日进行测试,其每日结果在单个C#线程中处理,其中生成LINQ/SQL查询并在线程结束之前将其发送到DB.除组合集ID序列外,结果之间没有逻辑关系.这非常重要:这就是为什么我想要并行化插入内容,因为它基本上等于结果块的批量转储
另一个可能重要的细节是可以预先确定将多少行插入到数据库中(每块和总数).这可能有助于组织表空间,通过页面拆分它们,预先修复id范围以便同时存储块,或类似的东西(不,我不是"高"或者什么:-))
我欢迎任何建议,以使插入时间尽可能短.
请考虑到我是一名C#开发人员,具有非常基本的SQL Server知识,并且不熟悉深层技术DBA概念(我看到锁定调整非常多,也有多线程和异步功能,但我必须承认我独自迷失在森林里:-))
我有12个CPU核心可用,24Go RAM
编辑:
决胜局
我欢迎任何关于监控整个过程时间的聪明建议:从C#线程开始/结束到详细的SQl服务器插入报告(什么时候,如何,以及在哪里发生).
我尝试使用NLog记录,但它大大缩短了处理时间,因此我正在寻找一些非常无缝且效果最小的智能解决方法.对于SQL服务器部分也是如此:我知道有几个日志和监控SP可用.我还没弄清楚哪些适合我的情况.
什么是硬件线程.是否总是可用处理器核心数量的两倍?如何确定Intel Core2 Duo处理器中的硬件线程数?可以通过Java代码确定吗?
我已经阅读了一些关于将消息从一个线程冒泡到所有其他线程以正常退出的正确方法的几个来源(每个线程都执行它自己的退出例程).其中,我喜欢可以从任何线程标记的全局原子布尔的想法,并且所有其他线程检查此标志以执行退出例程 - 当所有线程连接时,主线程可以退出应用程序.
纯粹的计算线程可能会以不同的方式处理,对吧?
这是有效和安全的吗?有一个更好的方法吗?
谢谢!
我开始乱用多线程来处理我正在运行的CPU密集型批处理.基本上我正在尝试将多个单页tiff压缩成单个PDF文档.这适用于foreach循环或标准迭代,但对于几百页文档来说可能非常慢.我尝试了以下基于我发现使用多线程的一些示例,并且它具有显着的性能改进但是它消除了页面顺序而不是1,2,3,4它将是1,3,4,2,6,5 on什么线程首先完成.
我的问题是如何在维护页面顺序的同时利用这种技术,如果可以,它会否定多线程的性能优势?先感谢您.
PdfDocument doc = new PdfDocument();
string mail = textBox1.Text;
string[] split = mail.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
int counter = split.Count();
// Source must be array or IList.
var source = Enumerable.Range(0, 100000).ToArray();
// Partition the entire source array.
var rangePartitioner = Partitioner.Create(0, counter);
double[] results = new double[counter];
// Loop over the partitions in parallel.
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
// Loop over each range element without a delegate invocation.
for (int i = range.Item1; …Run Code Online (Sandbox Code Playgroud) 我有一个作业队列(使用Amazon SQS),它将作业交给许多机器,用于通过HTTP获取和处理各种文档.有数百个不同的主机被访问,并且没有可预测的作业顺序.
为了礼貌,我不希望我的系统在一台主机上反复敲击.因此,如果我得到一份工作#123从example.com获取某些内容,但我发现我在过去的X秒内刚刚从example.com获取了另一件事,我应该转向其他内容并保存作业#123 for后来.
问题是,实现这种模式的好方法是什么?
似乎第一步是让作业运行者在所有域的某个位置保留一个列表,并且最后一次访问该域上的某些内容.我想这可能是一个简单的数据库表.
如果消息处理器获得必须延迟的作业,则有许多可能的选项可用于执行操作.
只需将消息的副本推送到队列的末尾,然后将其丢弃而不执行它.希望在下一次出现时,足够的时间过去了.这可能会导致大量冗余SQS消息,尤其是在同一域的大型作业集群同时通过的情况下.
在礼貌要求可以执行工作之前,需要休息几秒钟.这可能导致许多队列处理器同时无所事事.
接受作业,但将其保存在每个队列处理器上的某个本地队列中.我想每个处理器都可以通过这种方式"声称"一些工作,然后选择以任何顺序处理它们以达到最大程度的礼貌.这仍然是不可预测的,因为每个队列处理器需要知道被其他所有域击中的域.
为每个域建立单独的队列,并为每个队列分配一个进程.每个进程都必须在执行每个作业之间暂停X秒,因此会有很多睡眠进程开销,但这可能不是一件坏事.
你有设计这种东西的经验吗?你会推荐什么策略?
parallel-processing perl design-patterns job-queue amazon-sqs
我经常看到Haskell的并行策略的使用和解释与纯计算有关(例如fib).但是,我并不经常看到它与monadic结构一起使用:par当应用于ST s或者IO?时,是否有合理的解释效果和相关函数?这样的使用会增加任何加速吗?
有谁知道是否可以使用OpenMP与OCaml源代码?
或者与OCaml兼容的另一个应用程序/工作环境,允许我运行利用多个内核的并行程序?
如果有,怎么样?你有一个简单的例子吗?