TLS和PGAS有什么区别?

时间:2015-08-13 15:39:38

标签: multithreading memory parallel-processing

thread-local storage(TLS)和partitioned global address space(PGAS)之间的主要区别是什么?使用其中一种语言或程序的含义是什么?

1 个答案:

答案 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更有用,但编写后者更容易。