2

私は他の誰かの MPI コードを見ていますが、変数が宣言さmain()れ、他の関数で使用されることが何度もあります (一部の MPI 固有)。私は MPI を初めて使用しますが、私のプログラミング経験では、通常は行うべきではありません。基本的に、これを実行しても安全かどうかを判断するのは困難です (エラーはスローされません)。

コード全体は非常に長いので、簡略化したバージョンを以下に示します。

int main(int argc, char** argv) {
    // ...unrelated code
    int num_procs, local_rank, name_len;
    MPI_Comm comm_new;

    MPI_Init(&argc, &argv);
    MPI_Get_processor_name(proc_name, &name_len);

    create_ring_topology(&comm_new, &local_rank, &num_procs);
    // ...unrelated code

    MPI_Comm_free(&comm_new);
    MPI_Finalize();
}

void create_ring_topology(MPI_Comm* comm_new, int* local_rank, int* num_procs) {    
    MPI_Comm_size(MPI_COMM_WORLD, num_procs);

    int dims[1], periods[1];
    int dimension = 1;
    dims[0] = *num_procs;
    periods[0] = 1;
    int* local_coords = malloc(sizeof(int)*dimension);

    MPI_Cart_create(MPI_COMM_WORLD, dimension, dims, periods, 0, comm_new);
    MPI_Comm_rank(*comm_new, local_rank);
    MPI_Comm_size(*comm_new, num_procs);
    MPI_Cart_coords(*comm_new, *local_rank, dimension, local_coords);
    sprintf(s_local_coords, "[%d]", local_coords[0]);
}
4

1 に答える 1

3

これは通常のポインターの使用法です。それは何も悪いことではありません。

変数はスコープ内で宣言され、復帰するまで、つまりプログラムの実行中ほぼmainスコープ内にとどまります。main

MPI は実際には C に何も追加しないことに注意してください。それは追加のライブラリだけです。それは言語を拡張しません。

于 2013-10-03T05:50:57.797 に答える