如今,Erlang作为一种在多核上编写并行程序的语言,现在引起了很多人的兴趣.我听说有人认为Erlang的消息传递模型比主流共享内存模型(如线程)更容易编程.
相反,在高性能计算社区中,主要的并行编程模型是MPI,它也实现了消息传递模型.但是在HPC领域,这种消息传递模型通常被认为很难编程,人们认为OpenMP或UPC等共享内存模型更容易编程.
有谁知道为什么在IT和HPC世界中对消息传递与共享内存的看法存在这样的差异?是否由于Erlang和MPI如何实现消息传递的一些根本区别,使得Erlang风格的消息传递比MPI更容易?还是有其他原因吗?
我有一个data.frame列"a"和"b".我想添加名为"high"和"low"的列,其中包含a和b列中的最高和最低.
有没有办法在没有循环数据框中的行的情况下执行此操作?
编辑:这是针对OHLC数据的,因此高和低列应包含同一行上a和b之间的最高和最低元素,而不是整列.对不起,如果措辞不好.
以下代码是仅仅并行化第一个(外部)循环,还是并行化整个嵌套循环?
#pragma omp parallel for
for (int i=0;i<N;i++)
{
for (int j=0;j<M;j++)
{
//do task(i,j)//
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想确定上面的代码是否会并行化整个嵌套的for循环(因此一个线程直接相关的任务(i,j)),或者它只是并行化外部for循环(因此它确保了每个并行)带有循环索引i的线程,它的内部循环将在一个线程中顺序完成,这非常重要).
我想了解的确切差异#pragma omp critical和#pragma omp singleOpenMP中:
微软的定义是:
所以这意味着在两者中,之后的代码的确切部分将仅由一个线程执行而其他线程将不会进入该部分,例如,如果我们打印某些内容,我们将在屏幕上看到一次结果,对吧?
差异怎么样?它看起来很重要,可以处理执行时间,但不是单一的!但是我没有看到练习中的任何差异!这是否意味着其他线程(不进入该部分)的某种等待或同步被认为是关键的,但没有什么能够将其他线程保持在单一状态?它如何改变实践中的结果?
我很感激,如果有人能够通过一个例子向我澄清这一点.谢谢!
在Scala中,可以轻松地执行并行映射,forEach等,其中:
collection.par.map(..)
Run Code Online (Sandbox Code Playgroud)
在Kotlin有同等学历吗?
在scikit-learn的许多功能中实现了用户友好的并行化.例如,
sklearn.cross_validation.cross_val_score您只需在n_jobs参数中传递所需数量的计算作业.对于具有多核处理器的PC,它将非常好用.但是,如果我想在高性能集群中使用这样的选项(安装OpenMPI包并使用SLURM进行资源管理)?据我所知,sklearn使用joblib并行化multiprocessing.并且,正如我所知(例如,在这里,例如,mpi中的Python多处理)Python程序并行化,具有multiprocessing易于扩展的整个MPI架构和mpirun实用程序.我可以sklearn使用mpirun和n_jobs参数在几个计算节点上传播函数的计算吗?
python parallel-processing cluster-computing multiprocessing scikit-learn
人们认为Haskell在并行性方面具有优势,因为它具有不变的数据结构。但是Haskell也很懒。这意味着实际上可以将数据从thunk突变为评估结果。
因此,懒惰似乎会损害不变性的优势。我是错的还是Haskell有针对此问题的对策?还是这是Haskell的特色?
据我所知,MPI让我能够更好地控制集群中不同节点的通信方式.
在MapReduce/Hadoop中,每个节点进行一些计算,与其他节点交换数据,然后整理其结果分区.看起来很简单,但由于您可以迭代这个过程,甚至像K-means或PageRank这样的算法也能很好地适应模型.在具有调度位置的分布式文件系统上,性能显然很好.相比之下,MPI让我可以明确控制节点如何相互发送消息.
任何人都可以描述一个集群编程场景,其中更通用的MPI模型比简单的MapReduce模型更明显吗?
如果您想了解如何使用Perl解释器线程,有良好的文档perlthrtut(线程教程),并在threads附注手册页.写一些简单的脚本绝对够好.
但是,我发现在网络上的一些指导,为什么和怎样明智地使用Perl解释器线程.事实上,关于它们的讨论并不多,如果人们谈论它们,通常会阻止人们使用它们.
这些线程,可当perl -V:useithreads是useithreads='define';和释放use threads,也被称为的ithread,也许更恰当,以便他们有很大的不同,从由Linux或Windows操作系统或Java虚拟机中的任何内容所提供的线程默认情况下,而是一个共享大量数据被复制,而不仅仅是线程堆栈,因此显着增加了进程大小.(要查看效果,请在测试脚本中加载一些模块,然后在循环中创建线程,每次都按下按键,并观察任务管理器中的内存增加或top.)
[...]每次启动线程时,所有数据结构都将复制到新线程中.当我说全部,我的意思是全部.这包括包括stashes,全局变量,范围内的词汇.一切!
- 编程Perl ithreads之前需要了解的事情(Perlmonks 2003)
在研究Perl ithreads的主题时,你会看到人们不鼓励你使用它们("非常糟糕的主意","从根本上有缺陷",或"从不使用ithreads for any").
Perl线程教程强调"Perl线程是不同的",但它没有太多麻烦解释它们是如何不同以及这对用户意味着什么.
有关ithreads实际内容的有用但非常简短的解释来自WINDOWS PROCESS EMULATIONCoro标题下的联机帮助页.该模块的作者(Coro - perl中唯一真正的线程)也不鼓励使用Perl解释器线程.
在某处我读到,在启用线程的情况下编译perl会导致解释器显着变慢.
有从2003年Perlmonks页面(你需要的东西之前的Perl编程的ithread知道),其中笔者问:"现在你可能想知道为什么Perl中的ithread不使用fork()那不是已经取得了很多更有意义?" 这似乎是由forkspragma 的作者写的.不确定该页面上提供的信息在2012年仍适用于较新的Perls.
以下是Perl中线程使用的一些指导原则,我从读数中提炼出来(可能是错误的):
HTTP::Async,or AnyEvent::Socket或Coro::Socket.我从这里理解,任务执行顺序Task.Whenall不是确定性的,但我找不到任何有关结果顺序的信息.
结果集合是否按照输入中排序的任务或结果的顺序包含结果?
从我做的测试来看,它似乎保留了订单,但我需要确认.
c# parallel-processing concurrency asynchronous task-parallel-library
mpi ×2
openmp ×2
asynchronous ×1
c# ×1
c++ ×1
concurrency ×1
distributed ×1
erlang ×1
haskell ×1
immutability ×1
kotlin ×1
loops ×1
mapreduce ×1
max ×1
minimum ×1
multicore ×1
perl ×1
python ×1
r ×1
scikit-learn ×1