如何加速MPI呼叫?

时间:2014-02-21 13:55:19

标签: mpi openmp mpich

我尝试使用OpenMP加速简单的MPI程序。我使用MPICH2和4核Intel处理器。我有简单的代码:

int main(int argc, char** argv) {
    int size, rank, provided;
    const int root = 0;

    MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    int cubeCount = StrToDouble(argv[1]);
    int matrixSize = *StrToDouble(argv[2]);
    WorkNode node(rank, size, cubeCount, matrixSize);
    time_t t0 = time(0);
    node.work();
    time_t t1 = time(0);
    time_t total = t1 - t0;

类WorkNode也很简单,只包含Cube数组和方法工作。

class Cube {
public:
    Cube(int matrixSize);
    double *matrix;
    int matrixSize;
}

Cube::Cube(int matrixSize) {
    matrix = new double[matrixSize];
    this->matrixSize = matrixSize;
}

最后方法工作:

// double *inBuffer = new double[cubes[0]->matrixSize];
MPI_Status status;
for (int i = 0; i < processorCount; i++) {
    int nodeToSend = this->id + i;
    int nodeRecv = this->id - i;

    if (nodeToSend >= processorCount) {
        nodeToSend -= processorCount;
    }
    if (nodeRecv < 0) {
        nodeRecv += processorCount;
    }
#pragma omp parallel for num_threads(2)
    for (int i = 0; i < cubeCount; i++) {
        Cube *cube = cubes[i];
        if (nodeToSend != this->id) {
            MPI_Bsend(cube->matrix, cube->matrixSize, MPI_DOUBLE, nodeToSend, _MY_MPI_ANY_TAG, MPI_COMM_WORLD);
        }
        if (nodeRecv != this->id) {
            double *inBuffer = new double[cubes[0]->matrixSize];
            MPI_Recv(inBuffer, cube->matrixSize, MPI_DOUBLE, nodeRecv, _MY_MPI_ANY_TAG, MPI_COMM_WORLD, &status);
            delete inBuffer;
        }
    }
}
//delete inBuffer

不幸的是,openMP不会加速程序(即使MPI进程数= 2),有时甚至会减慢速度。我可以以某种方式加速MPI呼叫吗?

0 个答案:

没有答案