我是MPI编程的新手,很难学习,直到通过定义结构创建Derived数据类型我才成功.现在我想在我的结构中包含Vector,并希望在整个Process中发送数据.对于前:
struct Structure{
//Constructor
Structure(): X(nodes),mass(nodes),ac(nodes) {
//code to calculate the mass and accelerations
}
//Destructor
Structure() {}
//Variables
double radius;
double volume;
vector<double> mass;
vector<double> area;
//and some other variables
//Methods to calculate some physical properties
Run Code Online (Sandbox Code Playgroud)
现在使用MPI我想在整个过程中发送结构中的数据.我可以创建包含的MPI_type_struct向量并发送数据吗?
我尝试通过论坛阅读,但我无法从那里的回复中得到清晰的图片.希望我能够获得一个清晰的想法或方法来发送数据
PS:我可以单独发送数据,但是如果我们认为域非常大(比如10000*10000),那么使用MPI_Send/Recieve发送数据的开销可能是
一方面,在Haskell中Vector a似乎是用作数字数组的首选类型.甚至有一个(不完整的)矢量教程.
另一方面,Control.Parallel.Strategies主要是根据而定义的Traversable.矢量库不提供这些实例.
最小的完整定义也Traversable t应该定义Foldable和
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
sequenceA :: Applicative f => t (f a) -> f (t a)
Run Code Online (Sandbox Code Playgroud)
我看不出如何sequenceA定义Data.Vector.Unboxed.Vector.那么,使用未装箱的向量编写并行代码的最佳方法是什么?定义一些新的临时策略,如evalVector或使用par和pseq明确或使用普通Data.Array而不是向量?
PS Plain Array可并行化,没有问题:https://gist.github.com/701888
我从haskell并行性开始,我已经成功地学会了如何使用一些策略:r0, rseq, rdeepseq, parList, parMap.现在我正在寻求更高的效率.所以这是我的问题:parList和之间有什么区别parBuffer?在哪些情况下,每个策略都有效?
我必须用Python编写一个CPU绑定服务器,以便为许多内核分配工作负载.我想使用Twisted作为服务器(通过TCP进入的请求).
有没有更好的选择 - 使用安瓿,也许?我还看到一篇使用Twisted的文章pb与Popen一起进行交流 - 或者可能将它与multiprocessing?
关于MATLAB如何利用并行硬件,我有几个密切相关的问题.它们很短,所以我认为最好将它们放在同一篇文章中:
哪个列表,阵列或SEQ的是用于并行处理更高效,可以很容易地实现并行操作,例如parmap,parfilter等?
编辑:
感谢您的建议.Array.Parallel看起来是个不错的选择.还检查了PSeq.fs,我有一个关于如何pmap工作的问题.
let pmap f xs =
seq { for x in xs -> async { return f xs } }
|> Async.Parallel
|> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
是否为序列中的每个元素生成了一个新线程?如果是这样,是否有办法将seq分解为块并为每个块创建一个新任务以进行并行评估?
我还想看看pmap列表是否有类似的实现.我发现托马斯有一个ParallelList在他的博客实施后这里.但我不确定将列表转换为数组以执行并行评估是否会产生过多的开销,是否可以避免?
编辑: 感谢您的所有投入.托马斯回答了我原来的问题.
在第一次编辑中回答我自己的问题:
我尝试将一个大的列表分成块然后将异步应用于每个子列表.
let pmapchunk f xs =
let chunks = chunk chunksize xs
seq { for chunk in chunks -> async { return (Seq.map f) chunk } }
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.concat …Run Code Online (Sandbox Code Playgroud) 我编写了一个程序,用于使用c ++ 0x线程搜索数组中的最大值(用于学习目的).为了实现,我使用了标准线程和未来的类.但是,并行化功能不断显示与非并行化相同或更差的运行时间.
代码如下.我试图将数据存储在一维数组,多维数组中,最后得到几个数组.但是,没有选择取得好成绩.我试图从Eclipse和命令行编译和运行我的代码,仍然没有成功.我也尝试过类似的测试而不使用数组.并行化只提高了20%的速度.从我的角度来看,我运行非常简单的并行程序,没有锁和几乎没有资源共享(每个线程在他自己的数组上运行).什么是瓶颈?
我的机器配备2.2 GHz英特尔酷睿i7处理器和8 GB内存,运行Ubuntu 12.04.
const int n = 100000000;
int a[n], b[n], c[n], d[n];
int find_max_usual() {
int res = 0;
for (int i = 0; i < n; ++i) {
res = max(res, a[i]);
res = max(res, b[i]);
res = max(res, c[i]);
res = max(res, d[i]);
}
return res;
}
int find_max(int *a) {
int res = 0;
for (int i = 0; i < n; ++i)
res = max(res, a[i]); …Run Code Online (Sandbox Code Playgroud) 根据关于并行收集和在互联网上搜索的论文,并行集合应该与视图一起工作,但我不清楚它们之间的区别
coll.par.view.someChainedIterations
Run Code Online (Sandbox Code Playgroud)
和
coll.view.par.someChainedIterations
Run Code Online (Sandbox Code Playgroud)
似乎coll.view.par放弃了集合的视图:
scala> val coll = 1 to 3
coll: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)
scala> coll.view.par
res2: scala.collection.parallel.ParSeq[Int] = ParArray(1, 2, 3)
scala> coll.par.view
res3: java.lang.Object with scala.collection.parallel.ParSeqView[Int,scala.collection.parallel.immutable.ParSeq[Int],scala.collection.immutable.Seq[Int]] = $anon$1(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么.它是一个功能还是一个bug?
parallel-processing scala scala-collections parallel-collections
我认为这是R的能力极端,但是这里......
我在R中做了一些繁重的处理,其中我编写了一个函数,它可以通过一次调用完成所有腿部工作.但是,我想要连接或使用多个核心.
我看过Parallel包,它已经被弃用了.我理想地喜欢将函数称为新线程.
我理解并行计算的复杂性并不是世界上最简单的东西,但如果有人知道某些有用的软件包或我忽略的任何东西,我会很感激.
干杯
昨天我更新了我的R包,从那以后并列执行列车功能失败了.
似乎从工作者中调用的某些函数不可用.这些函数至少是flatTable和probFunction.
我在生产机器上遇到了这个问题,并且能够在干净的Windows 7 x64 VM上重现它.
我在下面添加了一个最小的工作示例 亲爱的stackoverflow用户:非常感谢!
# R 3.0.2 x64, RStudio Version 0.98.490, Windows 7 x64
data(iris)
library(caret) # 6.0-21
library(doParallel) # 1.0.6
model <- "rf"
# Fail
?probFunction
?flatTable
fitControl <- trainControl(
method = "repeatedcv"
, number = 5 ## 5-fold CV
, repeats = 1 ## repeated one times
, verboseIter =TRUE
)
#### Sequential Version ####
# Runs
train(Species ~ ., data = iris, method = model, trControl = fitControl)
#### Parallelized version ####
# …Run Code Online (Sandbox Code Playgroud)