2

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

#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 an enclosure OpenMP parallel pragma #pragma omp parallel default(none)

我不知道哪种范式(即shared, privatethreadprivate适用于这种类型的变量。哪一个是正确的使用?

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

编辑:

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

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

1 回答 1

3

__thread大致类似于threadprivateOpenMP 指令的效果。在很大程度上(当不涉及 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声明,您无需执行任何操作。

于 2013-11-15T12:34:29.240 回答