Я смотрю на код другого пользователя MPI, и есть несколько раз, что переменные объявлены в main()
и используются в других функциях (некоторые специфичные для MPI). Я новичок в MPI, но в своем опыте программирования, который обычно не должен выполняться. В основном мне сложно определить, безопасно ли это делать (ошибки не выбрасываются).C, область видимости 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]);
}
А, эта часть информации была тем, что мне не хватало. Так что-то упоминалось, что было объявлено в основном в безопасности? Я действительно не знаю правил о том, как распределяется адресное пространство между различными процессами. – asimes
Почти всегда. Если вы используете 'atexit()', вы можете запустить код после основных возвратов, поэтому любая переменная, объявленная в main, будет недоступна и, следовательно, небезопасна. – Adam
Хорошо, да, я не собираюсь делать ничего подобного, спасибо – asimes