MPI 在数组中搜索

MPI Search In Array

我正在尝试在数组中查找特定值。我试图通过 mpi 并行搜索找到它。当我的代码找到该值时,它显示错误。

错误

Assertion failed in file src/mpid/ch3/src/ch3u_buffer.c at line 77: FALSE
memcpy argument memory ranges overlap, dst_=0x7ffece7eb590 src_=0x7ffece7eb590 len_=4

计划

const char *FILENAME = "input.txt";
const size_t ARRAY_SIZE = 640;
int main(int argc, char **argv)
{
    int *array = malloc(sizeof(int) * ARRAY_SIZE);
    int rank,size;
    MPI_Status status;
    MPI_Request request;
    int done,myfound,inrange,nvalues;
    int i,j,dummy;

    /* Let the system do what it needs to start up MPI */
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    myfound=0;
    if (rank == 0)
    {
        createFile();
        array = readFile(FILENAME);
    }

    MPI_Bcast(array, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Irecv(&dummy, 1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &request);
    MPI_Test(&request, &done, &status);

    nvalues = ARRAY_SIZE / size;                                        //EACH PROCESS RUNS THAT MUCH NUMBER IN ARRAY
    i = rank * nvalues;                                                 //OFFSET FOR EACH PROCESS INSIDE THE ARRAY
    inrange = (i <= ((rank + 1) * nvalues - 1) && i >= rank * nvalues); //LIMIT OF THE OFFSET

    while (!done && inrange)
    {
        if (array[i] == 17)
        {
            dummy = 1;
            for (j = 0; j < size; j++)
            {
                MPI_Send(&dummy, 1, MPI_INT, j, 1, MPI_COMM_WORLD);
            }
            printf("P:%d found it at global index %d\n", rank, i);
            myfound = 1;
        }
        printf("P:%d - %d -  %d\n", rank, i, array[i]);
        MPI_Test(&request, &done, &status);
        ++i;
        inrange = (i <= ((rank + 1) * nvalues - 1) && i >= rank * nvalues);
    }
    if (!myfound)
    {
        printf("P:%d stopped at global index %d\n", rank, i - 1);
    }
    MPI_Finalize();
}

这里某处有错误,因为当我将无效数字(例如 -5)放入 if 条件时,程序运行顺利。

  dummy = 1;
    for (j = 0; j < size; j++)
    {
        MPI_Send(&dummy, 1, MPI_INT, j, 1, MPI_COMM_WORLD);
    }
    printf("P:%d found it at global index %d\n", rank, i);
    myfound = 1;

谢谢

您的程序对于 MPI 标准无效,因为您对 MPI_Irecv()MPI_Send() 使用相同的缓冲区 (&dummy)。

您可以使用两个不同的缓冲区(例如 dummy_senddummy_recv),或者因为您似乎并不关心 dummy 的值,那么使用 NULL 作为缓冲区和 send/receive 零大小消息。