multithreading - TLS 和 PGAS 之间有什么区别?

标签 multithreading memory parallel-processing

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

最佳答案

这些方法至少表面上相似,但实际含义却截然不同。

TLS 是一种指定自动变量(即堆栈上的数据)与操作系统 (OS) 线程(例如 POSIX 线程)而不是整个操作系统进程关联的方式。

下面是 OpenMP 中 TLS 的示例。我使用 OpenMP 是因为 GCC 或 Clang 尚不支持 C11 线程。 C11 (C++11) 中的等效语法是 _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;
}

在我的机器上,这段代码的输出是:

> 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

正如您在这里所看到的,每个线程上的 TLS 数据地址都不同,而没有 TLS 的全局地址对于所有线程来说都是相同的。

在 PGAS 中,通常假设一个分布式内存系统。默认情况下,数据被私有(private)地分配给每个线程(这里的线程可以是操作系统线程、操作系统进程或其他线程)。可以根据需要分配共享数据。

下面是一个 SHMEM 程序。在此程序中,sheap 数据是每个 PE(处理元素,通常是操作系统进程)中的指针,任何其他 PE 都可以使用诸如 shmem_getmem 之类的函数调用来访问该指针> 和shmem_putmem

#include <shmem.h>

int main(int argc, char* argv[])
{
    start_pes(0);
    int mype = my_pe();
    int npes = num_pes();

    int n = ( argc>1 ? atoi(argv[1]) : 1000);
    int * sheap = shmalloc(n*sizeof(int));
    if (sheap==NULL) exit(1);
    printf("PE %d: sheap base = %p\n", mype, sheap);
    shfree(sheap);

    return 0;
}

在像 UPC 这样的 PGAS 语言中,可以使用加载-存储语法,但如果数据位于远程位置(远程意味着分布式内存系统中的不同节点),编译器会将这些语法转换为网络通信函数调用。

TLS 和 PGAS 之间的根本区别在于,TLS 在线程上下文中工作,其中数据默认共享,并且 TLS 用于将其私有(private)化,而在 PGAS 中,所有数据都是私有(private)的。默认,并且可以根据请求分配共享数据。

这有帮助吗?我知道 C++11 和 UPC 示例比 OpenMP 和 SHMEM 更有帮助,但编写后者更容易。

关于multithreading - TLS 和 PGAS 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31992761/

相关文章:

java - 异步任务流程

multithreading - 基于 UDP 套接字的无速率文件传输

c# - 在系统启动时延迟服务

python - 递归函数内有一个列表对内存/资源的影响

java - 如何并行化 for 循环,并将每次重复的结果保存在矩阵中?

c# - 在独占线程约束下锁定

c++ - 在线程之间发送信号

python - 垃圾收集 python rss 内存

debugging - 为什么 "garbage"数据看起来没有意义?

parallel-processing - 如何在 MPI 中检查接收消息