在研究Go和Erlang的并发方法时,我注意到它们都依赖于消息传递.
这种方法显然减轻了对复杂锁的需求,因为没有共享状态.
但是,请考虑许多客户端希望对内存中的单个大型数据结构进行并行只读访问的情况 - 如后缀数组.
我的问题:
使用共享状态会比消息传递更快并且使用更少的内存,因为锁是大多数不必要的,因为数据是只读的,只需要存在于一个位置?
如何在消息传递上下文中处理此问题?是否存在可以访问数据结构的单个进程,客户端只需要从中顺序请求数据?或者,如果可能的话,数据是否会被分块以创建几个保存块的进程?
鉴于现代CPU和内存的架构,两种解决方案之间是否存在很大差异 - 即,可以通过多个内核并行读取共享内存 - 这意味着没有硬件瓶颈会使两个实现大致执行相同的操作?
我们可以中止这样的线程:
Thread thread = new Thread(SomeMethod);
.
.
.
thread.Abort();
Run Code Online (Sandbox Code Playgroud)
但是我可以以相同的方式中止任务(在.Net 4.0中)而不是取消机制.我想立即杀死任务.
我正在寻找并行运行测试套件的方法.
我知道 .testrunconfig设置.这允许您多路复用 CPU的数量.
我想并行运行1000个测试.这是有道理的,因为我正在测试一个Web服务,所以在测试中花费的90%的时间都在等待服务响应.
关于如何解决这个问题的任何想法?测试是为VS编写的,但我愿意在VS之外运行它们.
稍后编辑:Visual Studio测试团队已在VS 2015 Update 1中添加了此内容.请参阅Mark Sowul的答案.
c# parallel-processing unit-testing web-services visual-studio
你能否告诉我Apache Spark和AKKA之间的区别,我知道这两个框架都意味着编程分布式和并行计算,但我没有看到它们之间的链接或区别.
此外,我想得到适合他们每个人的用例.
parallel-processing distributed-computing bigdata akka apache-spark
全局变量在2个不同核心上的2个并发运行线程之间共享.线程写入和读取变量.对于原子变量,一个线程可以读取过时值吗?每个核心可能在其缓存中具有共享变量的值,并且当一个线程在缓存中写入其副本时,不同核心上的另一个线程可能从其自己的缓存中读取过时值.或者编译器执行强大的内存排序以从其他缓存中读取最新值?c ++ 11标准库具有std :: atomic支持.这与volatile关键字有何不同?在上述场景中,volatile和atomic类型的行为方式有何不同?
我对使用计算机集群运行Python程序感兴趣.我过去一直在使用Python MPI接口,但由于编译/安装这些接口有困难,我更喜欢使用内置模块的解决方案,例如Python的多处理模块.
我真正想做的只是设置一个multiprocessing.Pool跨越整个计算机集群的实例,并运行一个Pool.map(...).这是可能/容易做的事情吗?
如果这是不可能的,我希望至少能够Process从中央脚本的任何节点上启动实例,每个节点具有不同的参数.
我有为共享内存机器(在C和FORTRAN中)编码OpenMP的经验,可以执行矩阵添加,乘法等简单任务(只是为了看看它与LAPACK的竞争).我知道OpenMP足以执行简单的任务而无需查看文档.
最近,我为我的项目转移到Python,除了绝对的基础知识,我没有任何Python经验.
我的问题是:
在Python中使用OpenMP 最简单的方法是什么?最简单的,我的意思是那个在程序员方面花费最少的工作(即使是以增加的系统时间为代价)?
我使用OpenMP的原因是因为串行代码可以转换为一个工作的并行代码,其中有几个!$OMP散布在周围.实现粗略并行化所需的时间非常小.有没有办法在Python中复制这个功能?
通过浏览SO,我可以找到:
还有更多吗?哪个与我的问题最符合?
我正在尝试创建一个自旋锁的哑版.浏览网页时,我在x86中遇到了一个名为"PAUSE"的汇编指令,该指令用于向处理器提供当前在此CPU上运行自旋锁的提示.英特尔手册和其他可用信息说明了这一点
在大多数情况下,处理器使用此提示来避免内存顺序违规,从而大大提高了处理器性能.因此,建议在所有自旋等待循环中放置PAUSE指令.文档还提到"等待(一些延迟)"是指令的伪实现.
上段的最后一行很直观.如果我没有成功抓住锁,我必须等待一段时间然后再抓住锁.
但是,在旋转锁定的情况下,内存顺序违规是什么意思?"内存顺序违规"是否意味着旋转锁定后指令的错误推测加载/存储?
关于堆栈溢出之前已经询问了自旋锁定问题但是内存顺序违规问题仍未得到解决(至少对于我的理解).
在他们的arXiv论文中,Julia的原作者提到了以下内容:
2.14 Parallelism.并行执行由Julia在标准库中实现的基于消息的多处理系统提供.语言设计通过提供对称协程来支持这些库的实现,协同协程也可以被认为是协同调度的线程.此功能允许异步通信隐藏在库中,而不是要求用户设置回调.朱目前不支持本地线程,这是一种限制,但具有避免同步共享内存的使用的复杂性的优点.
他们说朱莉娅不支持原生线程是什么意思?什么是本机线程?
其他解释性语言(如Python或R)是否支持这种并行性?朱莉娅独自一人吗?
我正在玩Java 8的流,无法理解我得到的性能结果.我有2个核心CPU(Intel i73520M),Windows 8 x64和64位Java 8更新5.我正在做简单的字符串流/并行流Strings,发现并行版本有点慢.
Function<Stream<String>, Long> timeOperation = (Stream<String> stream) -> {
long time1 = System.nanoTime();
final List<String> list =
stream
.map(String::toLowerCase)
.collect(Collectors.toList());
long time2 = System.nanoTime();
return time2 - time1;
};
Consumer<Stream<String>> printTime = stream ->
System.out.println(timeOperation.apply(stream) / 1000000f);
String[] array = new String[1000000];
Arrays.fill(array, "AbabagalamagA");
printTime.accept(Arrays.stream(array)); // prints around 600
printTime.accept(Arrays.stream(array).parallel()); // prints around 900
Run Code Online (Sandbox Code Playgroud)
考虑到我有2个CPU内核的事实,并行版本不应该更快吗?有人能给我一个暗示为什么并行版本更慢?
python ×3
c# ×2
concurrency ×2
.net-4.0 ×1
akka ×1
apache-spark ×1
bigdata ×1
c++ ×1
c++11 ×1
erlang ×1
go ×1
intel ×1
java ×1
java-8 ×1
java-stream ×1
julia ×1
memory ×1
openmp ×1
performance ×1
r ×1
unit-testing ×1
web-services ×1
x86 ×1
x86-64 ×1