2016-09-16 40 views
0

這是問題所在。我有一些「小」數組,我不希望MPI_Gather變成一個大數組,但我只想在根(0)線程上分配一個大數組。在MPI,C++上分配單個堆棧陣列

#include <mpi.h> 
#include <iostream> 

int main(int argc, char **argv) { 

    int rank, numprocs; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
    MPI_Status status; 

    int N = 5; 
    int x[N] = {1,2,3,4,5}; 

    int big_x[numprocs*N]; 
    MPI_Gather(x, N, MPI_INT, big_x, N, MPI_INT, 0, MPI_COMM_WORLD); 

    if (rank == 0) { 
     for (int i=0; i<numprocs*N; ++i) 
      std::cout << big_x[i] << std::endl; 
    } 


    MPI_Finalize(); 
    return 0; 
} 

這是工作代碼,但正如你所看到的,我已經在每個線程上分配了big_x。什麼情況下我只想在一個線程中分配它?我會得到一個範圍錯誤。我應該只使用動態內存嗎?

回答

1

是的,你應該使用動態內存。

int *big_x = NULL; 
if (rank == 0) big_x = new int[numprocs*N]; 
... 
if (rank == 0) delete [] big_x; 

靜態數組的大小應該是恆定的。 所以int big_x[numprocs*N]是一個錯誤,因爲它分配在函數start上,在numprocs初始化之前。

另外

int N = 5; 
int x[N] = {1,2,3,4,5}; 

是錯誤,因爲N不是恆定的。 改爲使用const int N = 5#define N 5

+0

你好,petrmikheev,謝謝你的回答,這很清楚。而且我知道在編譯前階段應該知道數組的維數,但是我剛剛寫了一個例子,並且好奇的是,這個東西能夠工作。爲什麼它可以如此? (我在預編譯階段的維度上討論未知) – user2923317

+0

這是C99的功能和(如果我沒有弄錯)C++ 11。 'gcc' /'g ++'默認支持它,但其他編譯器可能不支持。請參閱http://stackoverflow.com/questions/26441916/dynamic-array-allocation-on-stack-in-c – petrmikheev

+0

我試圖檢查它。可變長度數組既不包含在C++ 11中,也包含在C++ 14中,也包含在C++ 17中。但'g ++'支持它。 另一個鏈接:http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c#1887178 – petrmikheev