Questions tagged «parallel-processing»

与并行处理形成鲜明对比的是,并行处理可确保启动/执行/完成以并行方式执行的所有线程级和/或指令级任务,并确保同时执行的代码路径完成。

13
如何阐明异步编程和并行编程之间的区别?
许多平台都将异步和并行性作为提高响应能力的手段。我通常了解这种差异,但经常发现我和其他人都难以阐明。 我是一个工作日的程序员,经常使用异步和回调。并行感让人感到异国情调。 但是我觉得它们很容易混淆,特别是在语言设计级别。很想清楚地描述它们之间的关系(或不存在关系),以及最适合应用它们的程序类别。

5
为什么我要在多个等待中选择一个“等待任务.WhenAll”?
如果我不在乎任务完成的顺序,而只需要全部完成,我还是应该使用await Task.WhenAll而不是多个await?例如,DoWork2下面是一种首选方法DoWork1(为什么?): using System; using System.Threading.Tasks; namespace ConsoleApp { class Program { static async Task<string> DoTaskAsync(string name, int timeout) { var start = DateTime.Now; Console.WriteLine("Enter {0}, {1}", name, timeout); await Task.Delay(timeout); Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds); return name; } static async Task DoWork1() { var t1 = DoTaskAsync("t1.1", …

8
Powershell可以并行运行命令吗?
我有一个powershell脚本来对一堆图像进行一些批处理,我想进行一些并行处理。Powershell似乎有一些后台处理选项,例如start-job,wait-job等,但是我发现进行并行工作的唯一好资源是编写脚本文本并运行它们(PowerShell Multithreading) 理想情况下,我想要类似于.net 4中的并行foreach的东西。 看起来很像的东西: foreach-parallel -threads 4 ($file in (Get-ChildItem $dir)) { .. Do Work } 也许我最好只是下降到C#...

4
多处理中的共享内存对象
假设我有一个很大的内存numpy数组,我有一个函数func将这个巨型数组作为输入(以及其他一些参数)。func具有不同参数的参数可以并行运行。例如: def func(arr, param): # do stuff to arr, param # build array arr pool = Pool(processes = 6) results = [pool.apply_async(func, [arr, param]) for param in all_params] output = [res.get() for res in results] 如果我使用多处理库,那么该巨型数组将多次复制到不同的进程中。 有没有办法让不同的进程共享同一数组?该数组对象是只读的,永远不会被修改。 更复杂的是,如果arr不是数组,而是任意python对象,是否可以共享它? [编辑] 我读了答案,但仍然有些困惑。由于fork()是写时复制的,因此在python多处理库中生成新进程时,我们不应调用任何额外的开销。但是下面的代码表明存在巨大的开销: from multiprocessing import Pool, Manager import numpy as np; import …

1
尽管只有22Mb的总内存使用量,Haskell线程还是会发生堆溢出?
我正在尝试并行化光线追踪器。这意味着我有很长的小型计算清单。Vanilla程序在特定场景上运行需要67.98秒,总内存使用量为13 MB,生产率为99.2%。 在我的第一次尝试中,我使用parBuffer了缓冲区大小为50 的并行策略。我之所以选择parBuffer它,是因为它仅在消耗火花时才通过列表,并且不会像这样强行parList使用列表的主干,因为它将消耗大量内存。因为列表很长。使用-N2,它的运行时间为100.46秒,总内存使用量为14 MB,生产率为97.8%。火花信息是:SPARKS: 480000 (476469 converted, 0 overflowed, 0 dud, 161 GC'd, 3370 fizzled) 大量的冒泡火花表示火花的粒度太小,因此接下来我尝试使用策略parListChunk,该策略将列表分成多个块并为每个块创建一个火花。块大小为时,我得到了最好的结果0.25 * imageWidth。该程序耗时93.43秒,总内存使用量为236 MB,生产率为97.3%。火花信息为:SPARKS: 2400 (2400 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)。我相信更多的内存使用是因为parListChunk强制列表的脊椎。 然后,我尝试编写自己的策略,将列表懒散地划分为多个块,然后将这些块传递给parBuffer并连接结果。 concat $ withStrategy (parBuffer 40 rdeepseq) (chunksOf 100 (map colorPixel pixels)) 耗时95.99秒,总内存使用量为22MB,生产率为98.8%。在所有火花都已转换并且内存使用率低得多的意义上说,这是成功的,但是速度并没有提高。这是事件日志配置文件的一部分的图像。 如您所见,由于堆溢出,线程正在停止。我尝试添加+RTS -M1G,这将默认堆大小一直增加到1Gb。结果没有改变。我读到Haskell主线程会在堆栈溢出时使用堆中的内存,因此我也尝试增加默认堆栈大小,+RTS -M1G -K1G但这也没有影响。 还有什么我可以尝试的吗?我可以根据需要发布有关内存使用情况或事件日志的更详细的分析信息,我没有全部包括在内,因为这是很多信息,我认为没有必要包括所有信息。 编辑:我正在阅读有关Haskell …

5
打破parallel.foreach?
如何突破parallel.for循环? 我有一个非常复杂的语句,如下所示: Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((ColorIndexHolder Element) => { if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { Found = true; break; } })); 使用并行类,到目前为止,我可以优化此过程。然而; 我不知道如何打破并行循环?该break;语句引发以下语法错误: 没有封闭循环可以中断或继续

7
lock语句的价格是多少?
我一直在尝试多线程和并行处理,并且我需要一个计数器来对处理速度进行一些基本的计数和统计分析。为了避免并发使用类的问题,我在类中的私有变量上使用了lock语句: private object mutex = new object(); public void Count(int amount) { lock(mutex) { done += amount; } } 但是我想知道...锁定变量有多昂贵?对性能的负面影响是什么?

4
MapReduce排序算法如何工作?
Terasort基准是用于演示MapReduce功能的主要示例之一。我在理解MapReduce环境中使用的排序算法的基础时遇到了麻烦。 对我而言,排序仅涉及确定元素相对于所有其他元素的相对位置。因此,分类涉及将“所有”与“所有”进行比较。您的平均排序算法(快速,冒泡,...)简单地以一种聪明的方式做到了。 在我看来,将数据集分为多个部分意味着您可以对单个部分进行排序,然后仍然必须将这些部分集成到“完整的”完全排序的数据集中。鉴于TB数据集分布在数千个系统中,我希望这是一项艰巨的任务。 那么这到底是怎么做的呢?该MapReduce排序算法如何工作? 感谢您帮助我理解。

5
决定子进程,多处理和Python中的线程?
我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器。我的并行化非常简单,因为程序的所有并行“线程”都是独立的,并将其输出写入单独的文件。我不需要线程交换信息,但是必须知道线程何时完成,因为管道的某些步骤取决于它们的输出。 可移植性很重要,因为我希望它可以在Mac,Linux和Windows上的任何Python版本上运行。考虑到这些限制,哪个是实现此功能的最合适的Python模块?我试图在线程,子进程和多处理之间做出选择,它们似乎都提供了相关的功能。 有什么想法吗?我想要最简单的便携式解决方案。

13
如何等待多个线程完成?
有什么方法可以简单地等待所有线程进程完成?例如,假设我有: public class DoSomethingInAThread implements Runnable{ public static void main(String[] args) { for (int n=0; n<1000; n++) { Thread t = new Thread(new DoSomethingInAThread()); t.start(); } // wait for all threads' run() methods to complete before continuing } public void run() { // do something here } } 如何更改此main()方法,以便该方法在注释处暂停,直到所有线程的run()方法退出?谢谢!


2
SLURM`srun` vs`sbatch`及其参数
我试图了解SLURMsrun和sbatch命令之间的区别。我将对一般性的解释感到满意,而不是对以下问题的具体答案感到满意,但是这里有一些具体的混淆点,可以作为起点并给出我所寻找的想法。 根据文档,srun用于提交作业,并且sbatch用于提交作业以供以后执行,但是实际区别对我来说尚不清楚,并且它们的行为似乎相同。例如,我有一个包含2个节点的群集,每个节点具有2个CPU。如果我srun testjob.sh &连续执行5次,它将很好地将第五个作业排队,直到CPU可用为止sbatch testjob.sh。 为了使问题更具体,我认为一个不错的起点是:我可以对某项做些什么而对另一项做不到,为什么? 这两个命令的许多参数都是相同的。似乎最相关的那些是--ntasks,--nodes,--cpus-per-task,--ntasks-per-node。它们之间如何相互关联,以及它们与srunvssbatch有何不同? 一个特别不同的是,srun如果将导致错误testjob.sh没有执行权限,即chmod +x testjob.sh而sbatch会开心地运行它。导致这种情况的“幕后”发生了什么? 该文档还提到srun了sbatch脚本内部常用的内容。这就引出了一个问题:它们之间如何相互作用,以及它们之间的“规范”用例是什么?具体来说,我会独自使用srun吗?

2
在多个进程之间共享结果队列
该multiprocessing模块的文档显示了如何将队列传递给以开头的进程multiprocessing.Process。但是,如何与开始的异步工作进程共享队列apply_async?我不需要动态加入或其他任何方法,而只是工人(反复)将其结果报告给基地的一种方法。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) 失败的原因是: RuntimeError: Queue objects should only be shared between processes through inheritance。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/取消酸洗(以及所有Windows特殊限制)。但如何做我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮助?


2
Repa数组上的并行mapM
在我最近的工作有Gibbs sampling,我已经作出了巨大的使用的RVar,在我看来,提供随机数生成近乎理想的接口。遗憾的是,由于无法在地图中使用单子动作,因此我无法使用Repa。 尽管显然单峰映射一般无法并行化,但在我看来,这RVar至少可以是一个可以安全地并行化效果的单子映射示例(至少在原理上;我对的内部运作并不十分熟悉RVar) 。即,我想写类似下面的东西, drawClass :: Sample -> RVar Class drawClass = ... drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples 这里A.mapM看起来是这样的, mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.