c - OpenMP 和带有 icc 的线程本地存储标识符

标签 c openmp icc thread-local-storage

这是一个简单的测试代码:

#include <stdlib.h>

__thread int a = 0;

int main() {

    #pragma omp parallel default(none)
    {
        a = 1;
    }

    return 0;
}

gcc 使用 -fopenmp 编译此文件没有任何问题,但 icc (ICC) 12.0.2 20110112 使用 -openmp 提示

test.c(7): error: "a" must be specified in a variable list at enclosing OpenMP parallel pragma #pragma omp parallel default(none)

我不知道哪种范例(即sharedprivatethreadprivate)适用于这种类型的变量。哪一种是正确的使用方法?

在调用访问该线程局部变量的函数时,我得到了预期的行为,但在显式并行部分中访问它时遇到了问题。

编辑:

到目前为止,我最好的解决方案是通过函数返回指向变量的指针

static inline int * get_a() { return &a; }

最佳答案

__thread 大致类似于 threadprivate OpenMP 指令所具有的效果。在很大程度上(当不涉及 C++ 对象时),两者经常使用相同的底层编译器机制实现,因此是兼容的,但不能保证始终工作。当然,现实世界远非理想,有时我们不得不牺牲可移植性来让事情在给定的开发限制内运行。

threadprivate 是指令而不是子句,因此您必须执行以下操作:

#include "header_providing_a.h"

#pragma omp threadprivate(a)

void parallel_using_a()
{
   #pragma omp parallel default(none) ...
     ... use 'a' here
}

GCC(至少版本 4.7.1)将 __thread 视为隐式 threadprivate 声明,您无需执行任何操作。

关于c - OpenMP 和带有 icc 的线程本地存储标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980937/

相关文章:

c++ - 使用 c 中结构的 malloc 对内存块进行索引

c - 由于正则表达式中的 malloc(0) 导致程序中止

c - C代码中使用OpenMP后输出错误

c++ - 英特尔 C++ 编译器将对象中的 vptr(指向虚函数表的指针)存储在哪里?

c - X509_NAME_oneline 返回的自由字符串

c - 在 C 中对字符串使用三元运算符

c - 为什么这段代码不能线性扩展?

c - 尝试编译 libeemd 时找不到库

c - 使用 icc 编译时我的程序无法正常运行

c++ - 无法找到头文件