Параллельная реализация MPI последовательного кода

У меня есть этот код, который использует метод Эйлера для решения простого ОДУ - dy/dt = 2y - 2t^2 - 3. Последовательный код принимает случайные значения для y_0 и вычисляет результат. Я хочу использовать MPI для отправки каждому узлу собственного значения y_0 и сбора результатов. Мне просто нужно использовать MPI_SEND и MPI_RECV? Вот мой серийный код.

#include <iostream>
#include <cmath>

using namespace std;

double tmax = 2.0; //max time value
double h = 0.00000005; //grid spacing
double imax = tmax/h;

double tarray [40000000] = {0}; //array for time values
double xarray [40000000] = {0}; //array for x values
double yarray [40000000] = {0}; //array for y values

//serial calculation for euler's method problem 1.7.1
void final171(double y0)
{
    yarray [0] = y0;

    for (int k = 0; k < imax; k++) {
        tarray[k+1] = tarray[k] + h;
        yarray[k+1] = yarray[k] + h * (2 * yarray[k] - 2 * tarray[k] * tarray[k] - 3);
    }
    cout << "Our Solution Euler: " << yarray[int(imax)];
}


int main(int argc, const char * argv[])
{
    clock_t serialStart;
    double serialTotal;
    srand((unsigned)time(0));

    serialStart = clock();
    for (int i = 0; i < 128; i++) {
        double floor = 0.5, ceiling = 3.5, range = (ceiling - floor);
        double rnd = floor + double((range * rand()) / (RAND_MAX + 1.0));
        final171(rnd);
        cout << ", for y0 = " << rnd << endl;
    }
    serialTotal = (double)(clock() - serialStart) / (double)(CLOCKS_PER_SEC);

    cout << endl << "N = " << imax << endl;
    cout << "Serial Time (s)" << serialTotal << endl;

    return 0;
}

person diggers3    schedule 04.12.2013    source источник


Ответы (1)


Использование MPI_SEND/MPI_RECV определенно сработает. Вы также можете использовать MPI_SCATTER, так как он будет делать то же самое, но более эффективно.

person Wesley Bland    schedule 04.12.2013