我在下面写了一个示例代码:
#include <stdio.h>
#include <mpi.h>
double x;
int main (int argc, char **argv) {
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank==0) x=10.1;
MPI_Barrier(MPI_COMM_WORLD);
printf("%f\n", x);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如人们可能注意到的,这个程序实际上定义了一个名为x的全局变量,而第0个线程试图为它分配一些值.当我在具有4个内核的SMP(对称多处理)机器上运行该程序时,我得到以下结果:
10.1
0
0
0
Run Code Online (Sandbox Code Playgroud)
更有趣的是,当我更改我的代码以便每个线程打印变量x的地址,即&x时,它们都打印相同的东西.
我的问题是,如果SMP系统上的一些线程共享一个变量地址的相同值,而它们不共享相同的值,那么该怎么可能?
我的第二个问题是我应该如何更改上面的代码,以便得到以下结果?
10.1
10.1
10.1
10.1
Run Code Online (Sandbox Code Playgroud) MPI-3标准规定,当且仅当原始和目标进程相同时MPI_Win_lock(...),锁定类型MPI_LOCK_SHARED必须是阻塞(独占)锁定.MPI_Win_lock_all是锁定类型的窗口中的所有进程的锁定MPI_LOCK_SHARED.
这是否意味着MPI_Win_lock_all还会创建从原点到原点的独占锁定?
我需要使用一些预先填充的数据打开Android设备的日历应用.我使用的逻辑似乎填充了以下字段:
我无法填充"提醒"部分,我想填写提醒部分.很高兴能得到一些帮助
这是我用来打开日历应用程序和填充日期的代码.
// Intent to open Calendar Event
Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Events.CONTENT_URI);
intent.putExtra(Events.DESCRIPTION, desc);
intent.putExtra(Events.EVENT_LOCATION, location);
intent.putExtra(Events.TITLE, summary);
intent.putExtra(Events.EVENT_TIMEZONE, beginTime.getTimeZone().getID());
intent.putExtra(Events.STATUS, statusStr);
intent.putExtra(Events.VISIBLE, transparency);
intent.putExtra(Events.RRULE, "FREQ=YEARLY;INTERVAL=1;BYYEARDAY=1,2;UNTIL=20161210;");
intent.putExtra(Events.EXDATE, androidExDateStr.toString());
// Not sure on how to use CalendarContract.Reminders, Tried the following but does not seem to be working
intent.putExtra(CalendarContract.Reminders.DESCRIPTION, desc);
intent.putExtra(CalendarContract.Reminders.EVENT_LOCATION, location);
intent.putExtra(CalendarContract.Reminders.TITLE, summary);
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
intent.putExtra(CalendarContract.Reminders.DTSTART, beginTime.getTimeInMillis());
intent.putExtra(CalendarContract.Reminders.EVENT_TIMEZONE, beginTime.getTimeZone().getID());
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
intent.putExtra(CalendarContract.Reminders.DTEND, endTime.getTimeInMillis());
intent.putExtra(CalendarContract.Reminders.STATUS, statusStr);
intent.putExtra(CalendarContract.Reminders.RRULE,"FREQ=YEARLY;INTERVAL=1;BYYEARDAY=1,2;UNTIL=20161210;");
intent.putExtra(CalendarContract.Reminders.EXDATE, androidExDateStr.toString());
//intent.putExtra(CalendarContract.Reminders.METHOD, Reminders.METHOD_EMAIL);
//intent.putExtra(CalendarContract.Reminders.MINUTES, reminderVal) ; …Run Code Online (Sandbox Code Playgroud) 我在Matlab代码中运行了两个for循环.内部循环使用Matlabpool在12个处理器中进行并行化(这是Matlab在单个机器中允许的最大值).
我没有分布式计算许可证.请帮我使用Octave或Scilab如何做到这一点.我只想将'for'循环并行化.
当我在谷歌搜索它时,有一些断开的链接.
我正在使用Seam并收到"并发呼叫对话"错误.这是什么意思?
我有一个按钮需要5分钟来处理.我在2分钟内收到此错误.将并发请求超时设置为10分钟似乎不起作用.有没有办法阻止所有其他请求,直到第一个请求完成?
我正在研究自动与MPICH2一起出现的新进程管理器,但直到现在我还无法弄清楚这个实现有什么大的进步,有人知道一个很好的教程或者有一些经验吗?
氩维基是一种太简单:http://wiki.mcs.anl.gov/mpich2/index.php/Using_the_Hydra_Process_Manager
我想知道如果OpenMPI/MPICH2集群的节点终止会发生什么?是否有一些机制可以容忍这种情况并继续执行?
谢谢你的回答海因里希
以下最小示例...
require(Rmpi)
set.seed(1)
foo <- parallel::mclapply(seq_len(10), function(l)
lapply(1:10, function(x) mean(rnorm(10000, mean=x))),
mc.cores=4)
Run Code Online (Sandbox Code Playgroud)
... 产生类型的警告消息
1: In selectChildren(ac, 1) : error 'Interrupted system call' in select
2: In selectChildren(ac, 1) : error 'Interrupted system call' in select
3: In selectChildren(ac, 1) : error 'Interrupted system call' in select
Run Code Online (Sandbox Code Playgroud)
如何避免它们?
我用Rmpi和parallel的mclapply一个包,这就是为什么我问。请注意,这已张贴在这里,但我还没有收到答复(还)。如果这很重要,我使用 Ubuntu 12.10、Emacs 24 和 R 2.15.2
我使用MVAPICH2启动了MPI程序,并收到此错误:
Fatal error in PMPI_Gather:
Invalid buffer pointer, error stack:
PMPI_Gather(923): MPI_Gather() failed
PMPI_Gather(857): Buffers must not be aliased
Run Code Online (Sandbox Code Playgroud)
我认为有两种方法可以解决此问题:
有人知道我该如何使用MVAPICH2吗?一些编译器选项,参数,环境变量等?
像MV2_NO_BUFFER_ALIAS_CHECK之类的东西,但是它不起作用。
是否可以在一方不知道另一方的等级的情况下进行 MPI_Sendrecv 交换?如果不是,那么最好的方法是什么(我的下一个猜测就是一对发送和接收)?
例如,在 C 中,如果我想在等级 0 和其他等级之间交换整数,这种类型的事情是否可行?:
MPI_Status stat;
if(rank){
int someval = 0;
MPI_Sendrecv(&someval, 1, MPI_INT, 0, 1, &recvbuf, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}else{
int someotherval = 1;
MPI_Sendrecv(&someotherval, 1, MPI_INT, MPI_ANY_SOURCE, someotherval, &recvbuf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}
Run Code Online (Sandbox Code Playgroud)
编辑:看起来这是不可能的。我将以下内容作为一种包装来添加我需要的功能。
void slave_sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
int dest, int sendtag, void *recvbuf, int recvcount,
MPI_Datatype recvtype, int source, int recvtag, MPI_Status *status){
MPI_Send(sendbuf, sendcount, sendtype, dest, sendtag, MPI_COMM_WORLD);
MPI_Recv(recvbuf, recvcount, recvtype, source, …Run Code Online (Sandbox Code Playgroud)