2016-09-16 4 views
0

ここに問題があります。私はいくつかの "小さな"配列を持っていますが、これはMPI_Gatherには大したものではありませんが、root(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つのスレッドでのみ割り当てたいのですが?私はスコープエラーを取得します。私はちょうど動的メモリを使用する必要がありますか?

答えて

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]は、numprocsの初期化の前に、関数startで割り当てられるため、エラーとなります。

また

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