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。什麼情況下我只想在一個線程中分配它?我會得到一個範圍錯誤。我應該只使用動態內存嗎?
你好,petrmikheev,謝謝你的回答,這很清楚。而且我知道在編譯前階段應該知道數組的維數,但是我剛剛寫了一個例子,並且好奇的是,這個東西能夠工作。爲什麼它可以如此? (我在預編譯階段的維度上討論未知) – user2923317
這是C99的功能和(如果我沒有弄錯)C++ 11。 'gcc' /'g ++'默認支持它,但其他編譯器可能不支持。請參閱http://stackoverflow.com/questions/26441916/dynamic-array-allocation-on-stack-in-c – petrmikheev
我試圖檢查它。可變長度數組既不包含在C++ 11中,也包含在C++ 14中,也包含在C++ 17中。但'g ++'支持它。 另一個鏈接:http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c#1887178 – petrmikheev