Может ли структура в UPC иметь общий массив как поле?

Мне нужно хранить общий массив внутри структуры в UPC. Можно ли это сделать?

1 ответ

Решение

Поля структуры не могут быть квалифицированы совместно, по той же причине, что они не могут быть объявлены статическими или внешними - поле структуры не несет независимой информации класса хранения (т. Е. Потому что поля структуры всегда хранятся непрерывно и могут использоваться для пример объявления переменной стека).

Однако структура может содержать поле массива, и структура может затем использоваться для определения общего объекта, например:

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

Однако обратите внимание, что распределение данных в этом примере - одна структура на поток, поле массива не распределено между потоками независимо.

Структура также может содержать указатель на разделяемый массив, например:

#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;

в этом случае общий массив распределяется по потокам, но хранилище не внедряется в структуру - поле структуры является просто указателем на общий ресурс (и благодаря правилам C можно получить доступ с помощью синтаксиса массива).

Другие вопросы по тегам