- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过同一个通信器,使用非阻塞版本的通信,将两个不同的、独立的数组从等级 0 分散到所有其他数组。
沿着这些线的东西:
//do some stuff with arrays here...
MPI_IScatterv(array1, partial_size1, displs1,
MPI_DOUBLE, local1, partial_size1,
MPI_DOUBLE, 0, some_communicator, &request);
MPI_IScatterv(array2, partial_size2, displs2,
MPI_DOUBLE, local2, partial_size2,
MPI_DOUBLE, 0, some_communicator, &request);
//do some stuff where none of the arrays is needed...
MPI_Wait(&request, &status);
//do stuff with the arrays...
所以...是否有可能(或者更确切地说,如果它保证始终没有错误)使用同一个通信器对 MPI_IScatterv 进行两次连续调用,或者可能会影响结果 - 弄乱来自两个分散的消息, 因为没有标签?
最佳答案
是的,根据 MPI standard 可以一次执行多个非阻塞集体操作.特别是在第 197 页的第 5.12 节中。非阻塞集体操作:
Multiple nonblocking collective operations can be outstanding on a single communicator. If the nonblocking call causes some system resource to be exhausted, then it will fail and generate an MPI exception. Quality implementations of MPI should ensure that this happens only in pathological cases. That is, an MPI implementation should be able to support a large number of pending nonblocking operations.
尽管如此,请确保对 MPI_Iscatterv()
的连续调用使用不同的 request
。函数MPI_Waitall()
用于检查多个非阻塞操作的完成情况。
MPI_Request requests[2];
MPI_Iscatterv(...,&requests[0]);
MPI_Iscatterv(...,&requests[1]);
MPI_Waitall(2,requests,...);
显示如何完成的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include <math.h>
int main(int argc, char *argv[]) {
MPI_Request requests[42];
MPI_Init(&argc,&argv);
int size,rank;
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int version,subversion;
MPI_Get_version( &version, &subversion );
if(rank==0){printf("MPI version %d.%d\n",version,subversion);}
//dimensions
int nbscatter=5;
int nlocal=2;
double* array=NULL;
int i,j,k;
//build a 2D array of nbscatter lines and nlocal*size columns on root process
if(rank==0){
array=malloc(nlocal*nbscatter*size*sizeof(double));
if(array==NULL){printf("malloc failure\n");}
for(i=0;i<nbscatter;i++){
for(j=0;j<size*nlocal;j++){
array[i*size*nlocal+j]=j+0.01*i;
printf("%lf ",array[i*size*nlocal+j]);
}
printf("\n");
}
}
//on each process, a 2D array of nbscatter lines and nlocal columns
double* arrayloc=malloc(nlocal*nbscatter*sizeof(double));
if(arrayloc==NULL){printf("malloc failure2\n");}
//counts and displacements
int* displs;
int* scounts;
displs = malloc(nbscatter*size*sizeof(int));
if(displs==NULL){printf("malloc failure\n");}
scounts = malloc(nbscatter*size*sizeof(int));
if(scounts==NULL){printf("malloc failure\n");}
for(i=0;i<nbscatter;i++){
for(j=0;j<size;j++){
displs[i*size+j]=j*nlocal;
scounts[i*size+j]=nlocal;
}
// scatter the lines
if(rank==0){
MPI_Iscatterv(&array[i*nlocal*size], &scounts[i*size], &displs[i*size],MPI_DOUBLE,&arrayloc[i*nlocal], nlocal,MPI_DOUBLE, 0, MPI_COMM_WORLD, &requests[i]);
}else{
MPI_Iscatterv(NULL, &scounts[i*size], &displs[i*size],MPI_DOUBLE,&arrayloc[i*nlocal], nlocal,MPI_DOUBLE, 0, MPI_COMM_WORLD, &requests[i]);
}
}
MPI_Status status[nbscatter];
if(MPI_Waitall(nbscatter,requests,status)!=MPI_SUCCESS){
printf("MPI_Waitall() failed\n");
}
if(rank==0){
free(array);
}
free(displs);
free(scounts);
//print the local array, containing the scattered columns
for(k=0;k<size;k++){
if(rank==k){
printf("on rank %d\n",k);
for(i=0;i<nbscatter;i++){
for(j=0;j<nlocal;j++){
printf("%lf ",arrayloc[i*nlocal+j]);
}
printf("\n");
}
}
MPI_Barrier(MPI_COMM_WORLD);
}
free(arrayloc);
MPI_Finalize();
return 0;
}
由mpicc main.c -o main -Wall
编译并由mpirun -np 4 main
运行
关于c - 使用相同的通信器连续调用 MPI_Scatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961503/
我想发送二维数组的列,每个列到单独的进程。我现在有一个完整的 2d 数组,但我被 MPI_Scatter 困住了。如何将整列作为字段发送? 谢谢 编辑: 我有数组 - float a[100][101
我正在尝试修改我的程序,以便代码看起来更好。现在我正在使用 MPI_Send 和 MPI_Recv,但我正在尝试使其与 MPI_Scatter 一起使用。我有一个名为 All_vals 的数组,我尝试
我正在开发一个并行排序程序来学习 MPI,但我一直在使用 MPI_Scatter 时遇到问题。每次我尝试运行时,我都会得到以下信息: reading input Scattering input _p
我知道,在处理 openMpi 时没有全局变量的概念/含义,因此当特定线程正在更改变量时,该变量的值仍将设置为其他进程中的默认值。我知道 MPI_Scatter() 的功能。 当我使用这样的东西时,
我是 MPI 世界的新手,我有点困惑.. 我使用“MPI_Scatter”将数组“分解”成多个部分。但情况是...它可以在多台机器上运行该程序吗? 我的观点是:我是否必须使用 MPI_Send 和 M
我有一个分配在连续内存空间中的动态二维数组,但是如果我尝试使用 MPI_Scatter 将该数组分散到两个 MPI 进程中,将导致段错误,整个代码粘贴在这里: dynamic_2d_array.h #
我是 MPI 的新手,我正在尝试编写使用 MPI_scatter 的程序。我有 4 个节点(0、1、2、3)。 Node0是master,其他都是slave。 Master 询问用户要发送给 slav
我正在尝试通过同一个通信器,使用非阻塞版本的通信,将两个不同的、独立的数组从等级 0 分散到所有其他数组。 沿着这些线的东西: //do some stuff with arrays here...
我想使用这种特定的内存分配方式将一个二维数组分散到其他二维数组中(每个进程一个)。 int (*matrix)[cols] = malloc(sizeof *matrix* rows); 我一直收到
我有这个串行代码,我正在尝试使用 MPI 将其转换为并行代码。但是,我似乎无法让 MPI_Scatter() 函数在不崩溃的情况下正常工作。该函数遍历名为 cells 的数组并修改一些值。 下面是原始
我正在使用 MPI 编写我的第一个程序,我很难尝试使用 MPI_Scatter 将数据正确发送到其他进程,修改它们并使用 MPI_Gather 接收值。代码如下: int** matrix; int
我正在尝试使用 MPI 库解决一个简单的程序。 进程0上存储了4*N×4*N的矩阵,矩阵每边的长度为DIM LEN = 4*N。我需要创建一个对角数据类型。但是,数据类型应该只覆盖对角线上的 N 个连
伙计们!我写了一段代码,用 MPI 计算两个巨大 vector 的标量积。首先,等级为 0 的进程创建两个随机 vector ,并通过 MPI_Scatter 将其发送给其余进程。之后,他们计算部分和
我的第一个想法是MPI_Scatter并且应该在if(proc_id == 0)子句中使用发送缓冲区分配,因为数据应该只分散一次并且每次进程只需要发送缓冲区中的一部分数据,但它无法正常工作。 看来,在
我正在学习 OpenMPI。尝试了一个简单的 MPI_Scatter 示例: #include using namespace std; int main() { int numProcs,
我的问题很简单,MPI_Scatter函数定义是: #include void MPI::Comm::Scatter(const void* sendbuf, int sendcount, cons
我正在尝试找到随机生成的数字的最大值。对此有任何想法... 我正在使用 MPI_Scatter 将随机生成的数字分成相等的进程。我正在使用 MPI_Reduce 从每个进程中获取最大值。 #inclu
我对 MPI_Scatter 有疑问。不知道如何使用它,我当前的程序在启动时因段错误而崩溃。 我猜 MPI_Scatter 的参数存在问题,尤其是在使用正确的运算符(& 或 * 或 void)调用它时
我是 mpi 编程的新手。我刚刚在 c 中使用 mpi_scatter 尝试了一个并行搜索程序。我想知道我的程序是否正确。但是当我执行一个没有 MPI_SCATTER 的程序时,即线性搜索,与并行程序
我正在尝试使用 MPI 编写矩阵 vector 乘法程序。我正在尝试将矩阵的列发送到单独的进程并在本地计算结果。最后,我使用 MPI_SUM 操作执行了 MPI_Reduce。 发送矩阵的行很容易,因
我是一名优秀的程序员,十分优秀!