假设我有一个调用的python脚本my_parallel_script.py涉及使用multiprocessing并行化几个东西,我使用以下命令运行它:
python -m cProfile my_parallel_script.py
Run Code Online (Sandbox Code Playgroud)
这仅为父进程生成分析输出.根本不记录在子进程中进行的呼叫.是否也可以分析子进程?
如果唯一的选择是修改源,那么最简单的方法是什么?
可能重复:
Haskell中多核编程的状态是什么?
特别是在GHC中的地位如何?它还很受欢迎,还是仍在试验?
编译器在决定何时以及如何并行化时有多细致/细粒度?运行时是否适当选择了线程池的大小,或者我们必须通过命令行指定?
在OpenMP中并行化多维尴尬并行循环的正确方法是什么?维度的数量在编译时是已知的,但是哪个维度是大的.他们中的任何一个可能是一,二或一百万.当然我不希望N omp parallel是一个N维循环......
思考:
问题在概念上很简单.只有最外层的"大"循环需要并行化,但循环维度在编译时是未知的并且可能会发生变化.
将动态设置omp_set_num_threads(1)和#pragma omp for schedule(static, huge_number)使某些环路并行化无操作?这会产生不良的副作用/开销吗?感觉像一个kludge.
在OpenMP规范(2.10,A.38,A.39)讲述整合及不符合要求的嵌套并行之间的差异,但没有提出解决这个问题的最好的办法.
可以重新排序循环,但可能会导致大量缓存未命中.展开是可能的,但不是重要的.还有另外一种方法吗?
这是我要并行化的内容:
for(i0=0; i0<n[0]; i0++) {
for(i1=0; i1<n[1]; i1++) {
...
for(iN=0; iN<n[N]; iN++) {
<embarrasingly parallel operations>
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
有没有人有在CUDA设备上实现哈希映射的经验?具体来说,我想知道如何在设备上分配内存并将结果复制回主机,或者是否有任何有用的库可以促进此任务.
看起来我需要先了解哈希映射的最大大小才能分配设备内存.我以前的所有CUDA努力都使用了数组和memcpys,因此非常简单.
任何洞察这个问题的人都表示赞赏.谢谢.
因此scala 2.9最近出现在Debian测试中,带来了新奇的并行集合.
假设我有一些相当于的代码
def expensiveFunction(x:Int):Int = {...}
def process(s:List[Int]):List[Int} = s.map(expensiveFunction)
Run Code Online (Sandbox Code Playgroud)
现在,在我的机器上实际显示文档之前,我已经收集到了关于并行集合的那些内容,我希望通过将List切换到ParList... 来并行化这个...但令我惊讶的是,没有一个!(只是ParVector,ParMap,ParSet...).
作为一个工作区,这个(或一行等效)似乎运作良好:
def process(s:List[Int]):List[Int} = {
val ps=scala.collection.parallel.immutable.ParVector()++s
val pr=ps.map(expensiveFunction)
List()++pr
}
Run Code Online (Sandbox Code Playgroud)
在我的测试代码中实现了大约x3的性能提升,并实现了更高的CPU使用率(四核和超线程i7).但它似乎有点笨重.
我的问题是一种汇总的:
ParList?ParList,我应该采用哪种更好的模式/习语,以至于我不觉得他们错过了?Vectors?(我指的是C++的土地,我通常会需要一个很好的理由使用
std::list过std::vector).我需要从许多Web数据提供程序中获取一些数据,这些数据提供程序不公开任何服务,因此我必须编写类似这样的内容,例如使用WWW :: Mechanize:
use WWW::Mechanize;
@urls = ('http://www.first.data.provider.com', 'http://www.second.data.provider.com', 'http://www.third.data.provider.com');
%results = {};
foreach my $url (@urls) {
$mech = WWW::Mechanize->new();
$mech->get($url);
$mech->form_number(1);
$mech->set_fields('user' => 'myuser', pass => 'mypass');
$resp = $mech->submit();
$results{$url} = parse($resp->content());
}
consume(%results);
Run Code Online (Sandbox Code Playgroud)
是否有一些(可能是简单的:-)方式将数据同时提取到一个公共的%结果变量,即:并行地从所有提供者那里获取?
我正在尝试使用D编程语言的MPI.D完全支持C ABI,可以链接并调用任何C代码.我已经完成了显而易见的事情并将MPI标题翻译为D.然后我将测试程序从维基百科翻译成D.我使用以下命令编译它:
dmd test.d -L-lmpistubs
它在我刚运行时起作用./test,并打印:
0: We have 1 processors
但是,当我跑步时mpiexec -n 8 test,它什么都不打印.我的理解是MPI可执行文件需要一堆奇怪的链接选项,这就是mpicc存在自动化过程的工具的原因.但是,如果我在D中尝试使用MPI,这对我没有帮助.我认为这是因为我没有使用正确的链接器选项.有人可以告诉我mpicc,我可以做什么以及如何让DMD做同样的事情?
编辑:我找到了答案mpicc -showme.这显示了mpicc转发的命令gcc.但是,我也意识到我做错了头文件翻译.下一个问题: 如何做对.
我有一些研究相关的问题.
目前我已经完成了基于MPI(特别是使用openmpi 6.3)的结构骨架框架的实现.框架工作应该在单台机器上使用.现在,我将它与其他先前的骨架实现(例如scandium,fast-flow,..)进行比较
我注意到的一件事是我的实现的性能不如其他实现.我认为这是因为,我的实现基于MPI(因此需要匹配发送和接收操作的双向通信),而我正在比较的其他实现基于共享内存.(...但我仍然没有很好的解释来证明这一点,这是我的问题的一部分)
这两个类别的完成时间有很大差异.
今天我也介绍了配置open-mpi for shared memory => openmpi-sm
我的问题出现了.
1,为共享内存配置MPI意味着什么?我的意思是MPI进程存在于自己的虚拟内存中; 究竟是什么标志就像在下面的命令一样呢?(我认为在MPI中,每次通信都是通过显式传递消息,进程之间没有共享内存).
shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out
Run Code Online (Sandbox Code Playgroud)
第二,为什么MPI的性能与为共享内存开发的其他骨架实现相比要差得多?至少我也在一台多核机器上运行它.(我想这是因为其他实现使用了线程并行编程,但我没有令人信服的解释).
任何建议或进一步讨论都是非常受欢迎的.
如果我需要进一步澄清我的问题,请告诉我.
感谢您的时间!
parallel-processing message-passing mpi shared-memory openmpi
我理解如何通过可变tasksupport字段设置单个并行集合的并行度级别(参见/sf/answers/379774811/).
如何在Scala 2.10中为所有新并行集合设置并行度级别?
一个附属问题---是由tasksupport并行集合"继承"并由它构建的新并行集合相关联的吗?(例如,与take,map等)
我一直在谷歌搜索这个问题的简单答案,但似乎没有一个.任何人都可以告诉我subprocess模块是否并行执行调用?Pythong.org文档建议它可以用来产生新的进程,但它没有提到它们是否并行.如果他们可以并行完成,你可以给我一个例子或链接我吗?