thread-local storage(TLS)和partitioned global address space(PGAS)之间的主要区别是什么?使用其中一种语言或程序的含义是什么?
答案 0 :(得分:2)
这些至少是表面上相似的方法,但实际意义却截然不同。
TLS是指定自动变量(即堆栈上的数据)与操作系统(OS)线程(例如POSIX线程)相关联而不是整个OS过程的方式。
以下是OpenMP中的TLS示例。我正在使用OpenMP,因为GCC或Clang尚不支持C11线程。 C11(C ++ 11)中的等效语法是while (res.next()) {
String colValue = res.getString("column_name");
System.out.println(colValue);
}
(_Thread_local
)。
thread_local
在我的机器上,此代码的输出为:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int p;
#pragma omp threadprivate(p)
int s;
int main(int argc, char **argv)
{
#pragma omp parallel
{
printf("%d: %p %p\n", omp_get_thread_num(), &p, &s );
}
return 0;
}
正如您在此处所看到的,每个线程上的TLS数据地址都不同,而没有TLS的全局地址对于所有线程都是相同的。
在PGAS中,通常假定分布式内存系统。数据被私下分配给每个线程(这里的线程可能是OS线程,OS进程或其他东西)默认情况下。可以根据需要分配共享数据。
以下是SHMEM计划。在此程序中,> OMP_NUM_THREADS=8 ./tls
1: 0x7fdbb1404ea8 0x1004a5060
2: 0x7fdbb1500c08 0x1004a5060
3: 0x7fdbb1500c18 0x1004a5060
4: 0x7fdbb1500c28 0x1004a5060
5: 0x7fdbb1500c38 0x1004a5060
6: 0x7fdbb1500c48 0x1004a5060
0: 0x7fdbb1500c58 0x1004a5060
7: 0x7fdbb1500c68 0x1004a5060
数据是每个PE(处理元素,通常是OS进程)中的指针,任何其他PE都可以使用sheap
和{{1}等函数调用来访问}。
shmem_getmem
在像UPC这样的PGAS语言中,可以使用加载 - 存储语法,但如果数据位于远程位置(远程意味着分布式内存系统中的不同节点),编译器会将这些语法转换为网络通信函数调用。
TLS和PGAS之间的根本区别在于TLS在线程上下文中工作,其中数据默认共享并且TLS用于私有化,而在PGAS中,所有数据都是私有的默认,并且可以根据请求分配共享数据。
这有帮助吗?我知道C ++ 11和UPC示例比OpenMP和SHMEM更有用,但编写后者更容易。