UPC 中的结构可以将共享数组作为字段吗?
Can a struct in UPC have shared array as a field?
我需要在 UPC 结构中存储共享数组。可以吗?
结构字段不能是共享限定的,出于同样的原因它们不能用静态或外部声明 - 结构字段不携带独立存储 - class 信息(即因为结构的字段是始终连续存储,并且可用于例如声明堆栈变量)。
然而,一个结构可能包含一个数组字段,然后该结构可以用来定义一个共享对象,例如:
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 规则。
我需要在 UPC 结构中存储共享数组。可以吗?
结构字段不能是共享限定的,出于同样的原因它们不能用静态或外部声明 - 结构字段不携带独立存储 - class 信息(即因为结构的字段是始终连续存储,并且可用于例如声明堆栈变量)。
然而,一个结构可能包含一个数组字段,然后该结构可以用来定义一个共享对象,例如:
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 规则。