我目前在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
        }

最佳答案

如果像在您的情况下那样在运行时确定数组的大小,则将给出可变长度的数组,C语言支持该数组,但标准C ++不支持。
因此,在C ++中,数组的大小必须是(编译时)常量。

为了克服这个问题,您必须使用动态内存分配。这可以通过“经典C”函数mallocfree(在C ++中很少使用),通过C ++垂饰newdelete(或new[]delete[])来实现,或-首选方式-通过使用容器对象(例如std::vector<int>)为您封装此内存分配问题。

关于c++ - MPI-当数组初始化值必须为常数时,如何为 worker 创建部分数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47319923/

10-11 22:51
查看更多