首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于 Unified Parallel C 中的指针1

关于 Unified Parallel C 中的指针1

UPC 语言中的指针类型UPC 语言把数据分为共享类型和私有类型。一个指针所指向的数据可能为共享类型或者私有类型,并且指针本身也可以是共享类型或者私有类型。因此 UPC 语言中的指针共有以下四种类型,参见图 1
  • 指向私有数据私有类型指针
  • 指向共享数据私有类型指针
  • 指向私有数据共享类型指针
  • 指向共享数据共享类型指针
图 1. UPC 语言指针类型指向私有数据私有类型指针如图 1 中的 p1 指针,是一个指向私有数据的私有类型指针。该指针类似于 C 语言中的普通的指针。当声明一个这样的指针时,UPC 语言会在每个线程的私有内存中为该指针的副本分配内存,即每个线程拥有该指针的一个副本。 该指针可以用来访问一个线程的私有数据。例如,下面的语句声明了一个指向私有数据私有类型指针:
1
int *p1;




清单 1. 指向私有数据私有类型指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <upc.h> // 假定由 2 个线程来运行该程序
# include <stdio.h>
# include <<stdlib.h>

int a=-1;

void main()
{
int *p1;
if(MYTHREAD == 1)
{
    // p1 指向动态分配的私有内存。
    p1=malloc(1*sizeof(int));
    *p1=1;
}
else
{
   // p1 指向变量 a.
   p1=&a;
}
   printf("Th=%d,*p1=%d\n",MYTHREAD,*p1);
}




图 2. 清单 1 程序内存视图图 3:清单 1 程序输出指向共享数据私有类型指针如图 1 中的 p2 指针,是一个指向共享数据的私有类型指针。当声明这个指针的时候,UPC 语言会为该指针,在每个线程的私有内存中分配内存,即每个线程均有该线程的一个副本。该指针可以用来访问共享数据。例如,下面语句声明了一个指向共享数据私有类型指针:
1
shared int *p2;




清单 2. 指向共享数据私有类型指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# include <upc.h> // 假定由 2 个线程来运行该程序
# include <stdio.h>

shared int a=0;

void main()
{

shared int *p2; // p2 是一个指向共享数据的私有类型指针

// 线程 1 对变量 a 进行初始化

if(MYTHREAD == 1)
   a=-1;

upc_barrier;

// p2 指针指向共享变量 a 所在的地址
p2=&a;

// 每个对 p2 指针进行间接引用的线程都会得到同样的值
printf("Th=%d,*p2=%d\n",MYTHREAD,*p2);
}




图 4. 清单 2 程序内存视图图 5. 清单 2 程序输出指向私有数据共享类型指针如图 1 中的 p3,是一个指向是有数据的共享类型指针。虽然每个线程都可以间接引用该指针,但只有对其初始化的线程或者是和该指针在同一个计算节点的线程,此操作才有意义。由于该类型指针可以被任何线程来调用访问其他线程的私有数据,不鼓励使用这种类型指针。例如,下面的语句声明了一个指向私有数据共享类型指针:
1
int * shared p3;




清单 3. 指向私有数据共享类型指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# include <upc.h> // 假定由 2 个线程来运行该程序
# include <stdio.h>

int *shared p3;

void main()
{
int a=MYTHREAD+99;
if(MYTHREAD == 1)
{
    // 将线程 1 将自己的私有变量 a 的地址赋给指针 p3.
  p3=&a;
}
upc_barrier;
printf("Th=%d,*p3=%d\n",MYTHREAD,*p3);
}




图 6. 清单 3 程序内存视图图 7. 清单 3 程序输出
返回列表