gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:34:30 24 4
gpt4 key购买 nike

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

#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 - 带有 icc 的 OpenMP 和线程本地存储标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com