在使用MPI的派生数据类型时,我被告知在使用
没有使用
使用
直到最近,我从未混合使用C和Fortran,并且从未在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
时,是否存在其他陷阱?对代码施加了哪些限制并禁用了哪些优化?