openmp threadprivate 和 gcc __thread 兼容性
openmp threadprivate and gcc __thread compatibility
我对“openMP 线程”的理解是它们可能不会一对一映射到 OS 线程。 openMP spec 似乎不需要这个。
GCC 有 the __thread
keyword,用于线程本地存储(根据我的解释,OS 线程中的线程)。这是否意味着 GCC __thread
与 openMP 的 threadprivate
不兼容?如果 openMP 规范允许将 openMP 线程复用到 OS 线程上,那么我认为 __thread
和 threadprivate
不兼容。
我看到前段时间有人question问过老版本的GCC,上面说基本兼容。对于较新版本的 GCC(例如 GCC 11.2)是否仍然适用?
大多数实现都是如此。我所知道的所有 OpenMP 实现都基于 OS 级线程([=19= 上的 pthreads,Windows 上的 Winthreads),因此 __thread
关键字应该没有问题C 或 C++ 中的 thread_local
。
但正如您所说的那样,这取决于事情的实施方式。 OpenMP API 没有就内部工作方式做出任何声明,因此从技术上讲,可以完成不基于 OS 级别线程的实现,然后可能会出现一些与 base-语言功能,OpenMP API 没有指定交互。
我对“openMP 线程”的理解是它们可能不会一对一映射到 OS 线程。 openMP spec 似乎不需要这个。
GCC 有 the __thread
keyword,用于线程本地存储(根据我的解释,OS 线程中的线程)。这是否意味着 GCC __thread
与 openMP 的 threadprivate
不兼容?如果 openMP 规范允许将 openMP 线程复用到 OS 线程上,那么我认为 __thread
和 threadprivate
不兼容。
我看到前段时间有人question问过老版本的GCC,上面说基本兼容。对于较新版本的 GCC(例如 GCC 11.2)是否仍然适用?
大多数实现都是如此。我所知道的所有 OpenMP 实现都基于 OS 级线程([=19= 上的 pthreads,Windows 上的 Winthreads),因此 __thread
关键字应该没有问题C 或 C++ 中的 thread_local
。
但正如您所说的那样,这取决于事情的实施方式。 OpenMP API 没有就内部工作方式做出任何声明,因此从技术上讲,可以完成不基于 OS 级别线程的实现,然后可能会出现一些与 base-语言功能,OpenMP API 没有指定交互。