我在UPC中编程并在两个线程之间共享一个数组。每个线程都有指向这些共享区域的私有指针:
#define SIZE 10000
#define HALFSIZE (SIZE/2)
shared [ HALFSIZE ] int table [ SIZE ]; /* all areas */
shared [ HALFSIZE ] int *first_area_pt; /* points to first thread area */
shared [ HALFSIZE ] int *second_area_pt; /* points to second thread area */
现在我不想2,但N个线程,N个区域和N个指针。所以我需要这些指针的数组:
shared [ HALFSIZE ] int *first_area_pt;
shared [ HALFSIZE ] int *second_area_pt;
我该如何定义它?
答案 0 :(得分:1)
假设您正在使用静态线程编译环境,更简洁的方式来声明您的数组将是这样的:
#define SIZE 10000
shared [*] int table [ SIZE ]; /* data automatically blocked across THREADS */
shared [1] int *base = (shared [1] int *)&table;
然后,您可以使用循环基指针创建一个指向共享的指针,该指针引用具有与线程X的亲和性的数据,其表达式如下:
shared [] int *threadXdata = (shared [] int *)(base+X);
使用这种方法,您永远不需要为THREADS指针数组实例化存储。但是,如果你真的想要,你当然可以用这样的东西声明和初始化:
shared [] int *threadptr[THREADS];
for (int i=0; i < THREADS; i++) threadptr[i] = (shared [] int *)(base+i);
...
threadptr[4][10] = 42; /* example access to element 10 on thread 4*/
这里threadptr是一个本地指针数组,用作每个线程数据的引用目录。
注意以上所有内容都使用无限期阻塞的指针共享来访问与单个线程具有亲缘关系的元素,因为每个块在逻辑上是一个连续的数据块,没有跨线程包装。
答案 1 :(得分:0)
由于您使用的符号是非标准的(尽管我按照UPC - 统一并行C - 规范收集它),我们只能猜测您可能需要的内容。突出你正在使用的东西是有帮助的,因为(当)它是不寻常的。
根据对shared [ N ]
符号的一种可能解释,这看起来似乎是合理的。
#define SIZE 10000
#define NUMTHREADS 25
#define FRACSIZE (SIZE/NUMTHREADS)
shared [ FRACSIZE ] int table[SIZE];
shared [ 1 ] int *area_ptr[NUMTHREADS];