Some ADIO functions, such as blocking and nonblocking versions of contiguous reads and writes, can be implemented by directly using their PFS counterparts. However, for functions not directly supported by PFS, the ADIO implementation must perform the task of expressing the ADIO functions in terms of available PFS calls. For example, noncontiguous requests can either be translated into several contiguous requests separated by seeks or can be implemented by using optimizations such as data sieving [23]. Collective operations can be implemented by using optimizations such as two-phase I/O [3,24].