在具有派生数据类型的 MPI 的上下文中,有人告诉我在使用该bind(C)
构造时要小心,因为它会抑制编译器的某些优化。考虑这个(不太可能的例子):
type, bind(C) :: myType
integer(2) :: a
complex :: z
integer(2) :: b
end type myType
如果没有该bind(C)
语句,编译器可能会重新排序结构并将两个整数分组以更好地对齐。特别是对于大型结构和尝试使用自动矢量化时,这将是有益的。
使用bind(C)
,这种重组是不可能的(为了保持与 的兼容C
,编译器可能不会优化那么多)。如果所有元素都与单词对齐,这将导致大量内存消耗(三个单词而不是两个单词),或者导致对齐丢失。(至少,有人告诉我。)
直到最近,我从未混合过 C 和 Fortran,也从未将派生类型用于 MPI 通信。在不久的将来,我将研究混合语言编程,这些问题似乎很重要。
所以我的问题有两个:
bind(C)
:这种错位是否在“现实世界”应用程序中起作用?有没有人在这里遇到过性能/优化问题?iso_c_binding
:(另外)使用该模块时是否还有其他陷阱iso_c_binding
?对代码施加了哪些限制以及禁用了哪些优化?