如何在MPI.NET for C#中指定一维数组的子集作为发送或接收缓冲区?
我正在学习使用MPI.NET的C#并行编程。在下面给出的示例中,我在每个进程中定义一个一维数组(x),然后对分配给该进程的相应部分(即仅分配x的部分)进行一些简单计算,以获得其在(y)中的相应部分。我的主要兴趣是将所有这些分配的部分(每个进程上计算的y部分)收集到根进程上的y数组中,以便最终计算总和。我的意思是,我想从位于根进程上的y阵列上的相应部分上的所有进程复制每个分配的部分;我唯一能做的就是将一维数组收集到二维数组中,或者将它们全部收集到一个新定义的一维数组中,大小为“comm.size*y.length”。当我搜索时,使用C++ C++中的“MPIYSead($sDunBf,sEncNT,sDeNeType,and RecBuf,ReCvCurt,RooT,COMM)”,我们能够完成这个任务,但是,在我看来,C语言中的“MPI.Guangy”是不同的,它没有C++中MPIYSead的灵活性。我需要将每个进程中y的所有计算部分收集到根进程上y数组中的相应位置。换句话说,如何在C#的MPI.NET中指定数组的子集作为发送或接收缓冲区。如果你能在这件事上帮助我,我将不胜感激如何在MPI.NET for C#中指定一维数组的子集作为发送或接收缓冲区?,c#,mpi,C#,Mpi,我正在学习使用MPI.NET的C#并行编程。在下面给出的示例中,我在每个进程中定义一个一维数组(x),然后对分配给该进程的相应部分(即仅分配x的部分)进行一些简单计算,以获得其在(y)中的相应部分。我的主要兴趣是将所有这些分配的部分(每个进程上计算的y部分)收集到根进程上的y数组中,以便最终计算总和。我的意思是,我想从位于根进程上的y阵列上的相应部分上的所有进程复制每个分配的部分;我唯一能做的就是将一维数组收集到二维数组中,或者将它们全部收集到一个新定义的一维数组中,大小为“comm.size*
using (new MPI.Environment(ref args))
{
double sumSerial = 0;
double sumParallel = 0;
int arraySize = 100000;
double[] x = new double[arraySize];
double[] y = new double[arraySize];
Intracommunicator comm = Communicator.world;
int numProc = comm.Size;
int numItr = arraySize / numProc;
for (int i = 0; i < x.Length; i++)
{
x[i] = i;
sumSerial += i;
}
int firstInx = comm.Rank * numItr;
int lastInx = firstInx + numItr;
for (int i = firstInx; i < lastInx; i++)
{
y[i] = 5.0 * x[i];
}
//double[][] zz=comm.Gather<double[]>(y,0);
double[] z = comm.GatherFlattened(y, 0);
comm.Barrier();
if (comm.Rank==0)
{
//for (int i = 0; i < numProc; i++)
//{
// for (int j = 0; j < zz[0].Length; j++)
// {
// sumParallel += zz[i][j];
// }
//}
for (int i = 0; i < z.Length; i++)
{
sumParallel += z[i];
}
Console.WriteLine("sum_Parallel: {0}; sum_Serial= {1};
Ratio: {2}; z_length: {3}", sumParallel, sumSerial,
sumParallel / sumSerial, z.Length);
}
}
使用(新的MPI.Environment(参考参数))
{
双sumSerial=0;
双相平行=0;
int arraySize=100000;
double[]x=新的double[arraySize];
double[]y=新的double[arraySize];
通信者内部通信=Communicator.world;
int numProc=公共大小;
int nummitr=阵列化/numProc;
对于(int i=0;i