У меня есть фортран-подпрограмма, вызывающая функцию 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;
}
}
исправило проблему.