首页 > 解决方案 > openmp threadprivate 和 gcc __thread 兼容性

问题描述

我对“openMP 线程”的理解是它们可能不会一对一地映射到 OS 线程。openMP规范似乎不需要这个。

GCC 有关键字__thread它用于线程本地存储(根据我的解释,线程与 OS 线程中的线程一样)。这是否意味着 GCC__thread与 openMP 不兼容threadprivate?如果openMP规范允许将openMP线程多路复用到OS线程上,那么我认为__thread并且threadprivate不兼容。

我看到不久前有人过旧版本的 GCC,它说它们基本上是兼容的。对于较新版本的 GCC(比如 GCC 11.2)仍然如此吗?

标签: copenmp

解决方案


大多数实现都是如此。我所知道的所有 OpenMP 实现都是基于操作系统级别的线程(Linux 上的 pthreads,Windows 上的 Winthreads),因此C 或C++ 中的__thread关键字应该没有问题。thread_local

但正如你所说的那样,这是事情如何实施的问题。OpenMP API 没有对事情必须如何在内部工作做出任何声明,因此从技术上讲,可以完成不基于操作系统级线程的实现,然后可能会破坏基础语言功能,OpenMP API 对此没有指定 thre 交互。


推荐阅读