Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MPI.NET for C#中指定一维数组的子集作为发送或接收缓冲区?_C#_Mpi - Fatal编程技术网

如何在MPI.NET for C#中指定一维数组的子集作为发送或接收缓冲区?

如何在MPI.NET for C#中指定一维数组的子集作为发送或接收缓冲区?,c#,mpi,C#,Mpi,我正在学习使用MPI.NET的C#并行编程。在下面给出的示例中,我在每个进程中定义一个一维数组(x),然后对分配给该进程的相应部分(即仅分配x的部分)进行一些简单计算,以获得其在(y)中的相应部分。我的主要兴趣是将所有这些分配的部分(每个进程上计算的y部分)收集到根进程上的y数组中,以便最终计算总和。我的意思是,我想从位于根进程上的y阵列上的相应部分上的所有进程复制每个分配的部分;我唯一能做的就是将一维数组收集到二维数组中,或者将它们全部收集到一个新定义的一维数组中,大小为“comm.size*

我正在学习使用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中指定数组的子集作为发送或接收缓冲区。如果你能在这件事上帮助我,我将不胜感激

            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