parallel-processingupc

Can a struct in UPC have shared array as a field?


I need to store shared array inside a struct in UPC. Is it possible to do?


Solution

  • Struct fields cannot be shared-qualified, for the same reason they cannot be declared with static or extern - a struct field does not carry independent storage-class information (ie because the fields of a struct are always stored contiguously, and could be used for example to declare a stack variable).

    However, a struct may contain an array field, and the struct can then be used to define a shared object, eg:

    struct S {
      int array[100];
      int foo;
    };
    shared struct S data[THREADS];
    ...
    data[MYTHREAD].array[0] = MYTHREAD;
    

    However note the distribution of data in this example is one struct per thread, the array field is not independently distributed across threads.

    A struct may also contain a pointer to a shared array, eg:

    #include <upc.h>
    
    struct R {
      shared int *sa;
      int bar;
    };
    ...
    struct R r;
    r.sa = upc_all_alloc(THREADS, sizeof(int));
    r.sa[MYTHREAD] = MYTHREAD;
    

    in this case the shared array is distributed across threads, but the storage is not embedded in the struct - the struct field is just a pointer-to-shared (and thanks to C rules can be accessed with array syntax).