[Patch, Fortran] -fcoarray=lib - add registering calls for nonallocatable coarrays

Tobias Burnus burnus@net-b.de
Thu May 26 09:05:00 GMT 2011


ping**0.3

http://gcc.gnu.org/ml/fortran/2011-05/msg00176.html

Tobias Burnus wrote:
> Instead of a ping, an updated patch. This one additionally supports 
> registering of nonallocatable coarrays also in MODULE and in BLOCK 
> plus a test case.
>
> (Changes to gfc_generate_module_vars and gfc_process_block_locals and 
> cgraph call in generate_coarray_init; some functions were moved up in 
> the trans-decl.c file.)
>
> OK for the trunk?
>
> Tobias
>
> On 22 May 2011, Tobias Burnus wrote:
>> The following applies to -fcoarray=lib; for -fcoarray=single there 
>> should be no change.
>>
>> The coarray communication library needs to know about the coarrays 
>> even before the function containing them has been invoked. Thus, the 
>> coarrays (of all translation units) need to be registered at start up.
>>
>> This patch handles this by creating a _caf_init function with 
>> constructor attribute, which is nested in the the parent's procedure 
>> if the latter contains local nonallocatable (and thus: static/SAVE) 
>> coarrays variables.
>>
>> At the same time, all (nonallocatable) coarrays have been turned into 
>> pointers - to allow the communication library to allocate the memory. 
>> This allows optimizations, e.g., by allocating in memory which is 
>> available for all images on the same node (cf. MPI_Alloc_mem).
>>
>> Additionally, a "token" is saved with the coarray, which allows the 
>> coarray library to identify the coarray. In a simple implementation, 
>> it could simply use the base_addr of the coarray or enumerate them 
>> through.
>>
>>
>> Example: The small example program
>>
>> ------------- < test.f90 >-----------------
>> program caf_program
>>   integer :: a[*] = 7
>>   a = 8
>> end program caf_program
>> ------------- </ test.f90 >-----------------
>>
>> is turned into the following tree (-fdump-tree-original)
>>
>> ------------- < test.f90.003t.original >-----------------
>> _caf_init.1 ()
>> {
>>   a = (integer(kind=4) * restrict) _gfortran_caf_register (4, 0, 
>> &caf_token.0, 0B, 0B, 0);
>>   *a = 7;
>> }
>>
>> caf_program ()
>> {
>>   static void * caf_token.0;
>>   static integer(kind=4) * restrict a;
>>   void _caf_init.1 (void);
>>
>>   (integer(kind=4)) *a = 8;
>> }
>>
>> main (integer(kind=4) argc, character(kind=1) * * argv)
>> {
>>   static integer(kind=4) options.2[8] = {68, 1023, 0, 0, 1, 1, 0, 1};
>>
>>   _gfortran_caf_init (&argc, &argv, &_gfortran_caf_this_image, 
>> &_gfortran_caf_num_images);
>>   _gfortran_set_args (argc, argv);
>>   _gfortran_set_options (8, &options.2[0]);
>>   _gfortran_caf_sync_all (0B, 0);
>>   caf_program ();
>>   __sync_synchronize ();
>>   _gfortran_caf_finalize ();
>>   return 0;
>> }
>> ------------- </ test.f90.003t.original >-----------------
>>
>> Note: By construction, _gfortran_caf_register is called before 
>> _gfortran_caf_init; thus, the MPI library will be initialized by the 
>> first _gfortran_caf_register call, unless the program does not have 
>> any nonallocatable coarrays.
>>
>> No test cases, but the ones in gfortran.dg/coarray/ should already 
>> test this functionality.
>>
>> To be done in later patches:
>> - Coarrays declared in modules (module variables)
>> - Allocatable coarrays
>>
>> Note: As constructors are never optimized away [unless they are 
>> pure/const], static coarrays and also uncalled functions containing 
>> static coarrays will not be optimized away. (Cf. PRs middle-end/49106 
>> and middle-end/49108.)
>>
>> Bootstrapped and regtested on x86-64-linux.
>> OK for the trunk?
>>
>> Tobias
>



More information about the Gcc-patches mailing list