UPC 语言">允许用户控制数据如何布局,而数据的布局又会影响到程序的性能。本文通过一系列的程序实例,使 UPC 语言的学习者,可以清楚地了解到如何从性能优化角度来合理地对数据进行布局。
UPC 中的数据分布
私有数据分布
在 UPC 中,私有数据只可以被自身所在的线程访问。当声明一个私有数据的时候,每个线程的私有内存里都会有该变量的副本。如清单中的几个声明语句,这些私有数据分布内存视图如图 1 所示。
清单 1. 私有数据声明
// 假设有 4 个线程。 int a; int b int c[3]
图 1. 清单 1 中数据分布内存视图
共享数据分布
在 UPC 语言中,共享数据可以被任何线程访问。当声明共享标量变量的时候,该变量会被分配到线程 0 的共享内存里。当声明共享数组的时候,UPC 语言引入了一个布局类型限定词。布局类型限定词决定多少个连续的共享元素被分配到同一个线程的共享内存空间中。例如 , 下面的声明了一个共享整型的数组 A:
shared [block_size] int A[number_of_elements];
[block_size] 是布局类型限定词,block_size 是一个非负的数值,代表数据分布区块的大小。例如,当布局类型限定词是 [3] 时,则每三个连续的元素为一个区块分配到一个线程的共享内存空间中。假若布局类型限定词是下列的情形,区块大小有所不同:
如果布局类型限定词不存在的情况下,则所声明的共享数组按照区块大小为 1 进行分配。 如果布局类型限定词为 [ ] 或者 [0], 说明区块大小为无穷大,则所声明的共享数组将所有元素分配到线程 0 的共享内存空间中。 如果布局类型限定词为 [*], 则所声明的共享数组将按照区块大小为 ( sizeof(
array) / upc_elemsizeof(array) + THREADS - 1 ) / THREADS 进行分配。
清单 2. 共享数据声明
// 假定有四个线程 shared int X; // 声明了一个共享整型数据 shared[2]int Y[9]; // 声明了一个共享整型类型数组 , 数组中包含 9 个共享整型类型元素 shared [] float Z[3]; // 声明一个共享
浮点类型数组,数据分布区块大小为无穷大,该数组有 3 个元素,位于线程 0 // 的共享内存空间
图 2. 清单 2 中数据分布内存视图