2013-10-03 6 views
2

Я смотрю на код другого пользователя 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]); 
} 

ответ

3

Это просто регулярное использование указателя. В этом нет ничего плохого.

Переменные объявляются в main и остаются в области видимости до тех пор, пока main не вернется, то есть почти на время работы программы.

Обратите внимание, что MPI на самом деле ничего не добавляет к C. Все это дополнительная библиотека. Он не расширяет язык.

+0

А, эта часть информации была тем, что мне не хватало. Так что-то упоминалось, что было объявлено в основном в безопасности? Я действительно не знаю правил о том, как распределяется адресное пространство между различными процессами. – asimes

+0

Почти всегда. Если вы используете 'atexit()', вы можете запустить код после основных возвратов, поэтому любая переменная, объявленная в main, будет недоступна и, следовательно, небезопасна. – Adam

+0

Хорошо, да, я не собираюсь делать ничего подобного, спасибо – asimes

Смежные вопросы