MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组

MPI - How to create partial arrays for workers when array initialization value must be constant?

本文关键字:数组 工作 线程 创建部 常量 初始化 MPI      更新时间:2023-10-16

我目前对C++或MPI没有太多经验,所以我认为这将是一个容易回答的问题。

我希望能够更改可以出于实验目的对数组排序工作的进程数,但是当我尝试为我的工作线程声明一个部分数组时,我收到一个错误,指出数组大小变量 PART 需要是常量。

这是来自我计算或解析它的方式,还是来自 MPI 机制?

const int arraySize = 10000    
int main(int argc, char ** argv)
    {
        MPI_Init(&argc, &argv);
        int rank;
        int size;
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        const int PART = floor(arraySize / size);
        auto start = std::chrono::high_resolution_clock::now(); //start timer
        //================================ WORKER PROCESSES ===============================
        if (rank != 0)
        {
            int tmpArray[PART];       //HERE IS MY PROBLEM
            MPI_Recv(&tmpArray, PART, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);    //recieve data into local initalized array
            qsort(&tmpArray[0], PART, sizeof(int), compare);                                // quick sort
            MPI_Send(&tmpArray, PART, MPI_INT, 0, 0, MPI_COMM_WORLD);                       //send sorted array back to rank 0
        }

auto tmpArray = std::make_unique<int[]>(PART);

如果数组的大小是在运行时确定的,就像你的情况一样,这将给出一个可变长度的数组,它在 C 中受支持,但在标准C++中不受支持。因此,在C++中,数组的大小需要是一个(编译时(常量。

要解决此问题,您必须使用动态内存分配。这可以通过"经典 C"函数mallocfree(在C++中很少使用(,通过它们的C++挂newdelete(或new[]delete[](来实现,或者 - 首选方式 - 通过使用容器对象来实现,例如,std::vector<int>为您封装此内存分配问题。