我使用任务并行库从.NET框架4(特别是Parallel.For和Parallel.ForEach)并行有些任务看起来像他们应该在双核机器上容易实现并行然而,当我得到极其平庸速度起坐.
在分析系统时,由于垃圾收集器,看起来有很多线程同步正在进行.我正在进行大量的对象分配,所以我想知道如何在最小化代码重写的同时提高并发性.
例如,在这种情况下是否有一些技术可用:
Dispose吗?后记:
问题不在于GC运行得太频繁,而是GC阻止并发代码有效并行运行.我也不认为"分配更少的对象"是可接受的答案.这需要重写太多代码来解决一个很难并行化的垃圾收集器.
我已经发现了一个有助于整体性能的技巧(使用gcServer),但它并没有帮助并发性能.换句话说Parallel.For,在一个令人尴尬的并行任务上,它比串行For循环快20%.
后后记:
好的,让我进一步解释一下,我有一个相当大而复杂的程序:一个优化的解释器.它足够快,但我希望它在给定并行任务(我的语言中内置的基本操作)时的性能,以便在更多内核可用时进行扩展.我在评估期间分配了大量小对象.整个解释器设计基于从单个多态基础对象派生的所有值.这在单线程应用程序中运行良好,但是当我们尝试将任务并行库应用于并行评估时,没有任何优势.
经过大量调查,为什么任务并行库没有为这些任务在核心之间正确地分配工作,似乎罪魁祸首是GC.显然GC似乎是一个瓶颈,因为它做了一些我不理解的场景线程同步.
我需要知道的是:究竟是GC这样做可能会导致严重的并发代码来执行不好当它大量拨款,以及我们如何解决这除了刚刚分配较少的对象.我已经想到了这种方法,并且需要对大量代码进行重大改写.
.net parallel-processing concurrency performance garbage-collection
我按照http://blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine上的说明进行操作.aspx到这封信,我可以并行执行测试.
到现在为止还挺好.
现在的问题是:我无法将parallelTestCount设置为零(自动配置)或大于5的值.运行五个并行测试工作正常但不是六个.
是的,我的机器上有五个以上的核心; 我在Intel i7处理器上运行,它有四个超线程核心,这意味着我应该可以并行运行8个测试.
现在我确定还有一些其他的逻辑或硬限制,我不希望能够在八个核心上运行,并行地加速八个测试.
但是,知道它没有并行运行超过五个测试的原因会很酷吗?
parallel-processing unit-testing visual-studio-2010 visual-studio
Haskell是否具有相当于Alice将变量绑定到未来的能力?
val a = spawn foo;
Run Code Online (Sandbox Code Playgroud)
其中foo是一些功能.
我知道Haskell支持频道和线程; 我希望语法像Alice一样自然地将值绑定到未来并生成一个线程来计算它而不必处理细节.
我刚读了一篇关于Leader/Follower模式的论文,如果我理解正确,我会将我的工作人员留在队列中,第一个工作人员接收传入请求并从队列中分离.
使用正常的工作队列(例如,rabbitmq和beanstalkd),反之亦然:我将我的工作保留在队列中,一旦工人完成处理,它就会从队列中获取第一个工作.
有什么东西我不见了?
那么,我应该使用Leader/Follower方法而不是工作队列的优势是什么?或者反过来说,在什么情况下工作队列更适合?
再见,尼科
我需要将一些包含空格和其他字符的文本传递给由GNU Parallel运行的脚本.
这是一个非常简单的例子:
$ seq 1 3 | parallel echo "Quoted ' (text)"
Run Code Online (Sandbox Code Playgroud)
上面的例子将输出:
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,一切正常:
seq 1 …Run Code Online (Sandbox Code Playgroud) 我可以像这样按值对ConcurrentDictionary进行排序:
static ConcurrentDictionary<string, Proxy> Proxies =
new ConcurrentDictionary<string, Proxy>();
Proxies.OrderBy(p => p.Value.Speed);
Run Code Online (Sandbox Code Playgroud)
这很好,除了我想将新的重新排序的列表设置为字典,有效地排序字典本身而不是仅仅接收已排序项的结果列表.
我尝试做这样的事情,但没有运气 - 字典仍然无序后:
Proxies = new ConcurrentDictionary<string,Proxy>(
Proxies.OrderBy(p => p.Value.Speed));
Run Code Online (Sandbox Code Playgroud)
似乎这样做对字典没有影响.我也尝试将OrderBy结果转换为一个新的var,认为它可能对委托产生影响但仍然没有运气.
如何重新订购此ConcurrentDictionary,然后强制字典成为OrderBy的重新排序结果?
c# parallel-processing concurrency concurrent-programming c#-4.0
我有一个嵌套的for循环.我用a替换了第一个For Parallel.For()并且计算速度增加了.
我的问题是用一个替换第二个(内部一个)Parallel.For().它会提高速度吗?还是没有区别?还是会慢一点?
编辑:
由于核心不是无限制的(通常有2到8个核心),因此内部循环并行运行.所以,如果我用a更改内部Parallel.For(),它再次并行运行.但我不确定它如何改变性能和速度.
我有一些代码将2D数组打印到标准输出.问题是,当我运行它时,每个进程都会写入输出并且数据重叠,使其无法使用.
如何在MPI中构建一个关键部分,以便一次只有一个进程进入我显示输出的部分?
我正在使用OpenMPI.
我是Google Go(Golang)的新手.我的问题与这篇文章有关.status.Gosched究竟做了什么?.代码结构如下所示.我的问题是,当我更改GOMAXPROCS中的处理器数量时,如何验证它运行的处理器数量.当我做'顶'时,它显示a.out过程,即使GOMAXPROCS超过1,也会消耗100%或更少的资源.我将非常感谢你的帮助.
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func doTasks() {
fmt.Println(" Doing task ")
for ji := 1; ji < 100000000; ji++ {
for io := 1; io < 10; io++ {
//Some computations
}
}
runtime.Gosched()
wg.Done()
}
func main() {
wg.Add(1)
runtime.GOMAXPROCS(1) // or 2 or 4
go doTasks()
doTasks()
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud) 我在Python中使用RabbitMQ来管理生产者和多个消费者之间的几个队列.在RabbitMQ网站(路由模型)的示例中,消费者被阻止.这意味着它们会在start_consuming()上停止并在每次队列中有新的"任务"时执行回调函数.
我的问题是:如何以他仍在等待任务的方式实现我的消费者(因此,每次队列中有新的东西时都会调用回调函数)但同时他可以执行其他工作/代码.
谢谢
concurrency ×3
c# ×2
queue ×2
.net ×1
alice ×1
args ×1
asynchronous ×1
bash ×1
c#-4.0 ×1
distributed ×1
future ×1
go ×1
haskell ×1
mpi ×1
performance ×1
python ×1
rabbitmq ×1
scalability ×1
unit-testing ×1