Почему моя подпрограмма fortran передает неверное значение моей функции C ++? - PullRequest
1 голос
/ 28 февраля 2020

У меня есть фортран-подпрограмма, вызывающая функцию C ++ во внешней библиотеке c. У меня есть целое число:

integer (c_int) :: processor_wall_point_count

То, что просто передается функции:

print*, processor_wall_point_count         ! gives 112
call fci_wmm_allocate_domain(processor_wall_point_count, wall_model_ray_point_count)

Функция C ++:

void fci_wmm_allocate_domain(int* _processor_wall_point_count, int* _ray_point_count)
{
    std::cout << *_processor_wall_point_count << std::endl; // gives 70
}

Основной код имеет Среда MPI, и при запуске на 10 процессорах с

print*, process_id, processor_wall_point_count !process id, variable
call MPI_Barrier()
call fci_wmm_allocate_domain(processor_wall_point_count, wall_model_ray_point_count)

и в C ++:

void fci_wmm_allocate_domain(int* _processor_wall_point_count, int* _ray_point_count)
{
    std::cout << process_id << ", " <<*_processor_wall_point_count << std::endl;
    MPI_Barrier(MPI_COMM_WORLD);
}

я получаю следующее:

       8          32
       9           0
       0          16
       2          48
       6           0
       1           0
       3          16
       5           0
       7           0
       4           0
2, 48
8, 32
0, 10
3, 16
5, 0
9, 0
6, 0
1, 0
7, 0
4, 0

Т.е. все значения передаются правильно, за исключением процессора 0. Я использовал привязки C раньше без (слишком много) проблем. Что здесь происходит?

РЕДАКТИРОВАТЬ: вот интерфейс fortran:

interface
    subroutine fci_wmm_allocate_domain(point_count_F, ray_points_F) bind (c)
        use iso_c_binding
        integer (c_int), intent(in)    :: point_count_F, ray_points_F
    end subroutine fci_wmm_allocate_domain
end interface

ВЫПУСК: Я не уверен, как я пропустил это, но у меня была следующая функция, вызываемая только upstream на процессоре 0:

void print_node_info(void)
{
    if (is_node_root_process && verbose)
    {
        std::cout << "[I] Node " << node_name << " (0x";
        std::cout << std::hex << processor_node_id;
        std::cout << ") has root process " << current_node_root_process_id << std::endl;
    }
}

Изменение на

void print_node_info(void)
{
    if (is_node_root_process && verbose)
    {
        std::cout << "[I] Node " << node_name << " (0x";
        std::cout << std::hex << processor_node_id << std::dec;
        std::cout << ") has root process " << current_node_root_process_id << std::endl;
    }
}

исправило проблему.

1 Ответ

2 голосов
/ 28 февраля 2020

Интересно, что 112 = 0x70 и 16 = 0x10. Может ли это быть где-то забытым потоковым манипулятором C ++ (std::hex) где-нибудь?

...