gpt4 book ai didi

c++ - 全局变量外部声明后的 Threadprivate 指令

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:30 27 4
gpt4 key购买 nike

我有四个全局变量

extern Vars vars;
extern Params params;
extern Workspace work;
extern Settings settings

我正在尝试使用以下方式使线程私有(private):

#pragma omp threadprivate(vars,params,work,settings)

然后我调用这个函数:

void parallelSolver(void *handle, Params *paramsIn, double* data, int dataNum){
int i;
#pragma omp parallel for
for (i = 0; i < dataNum; i++) { // Main control loop.
Params paramsOW = load_data(*paramsIn, data, i);
csolve(paramsOW);
}
}

它将每次单独运行的数据加载到 paramsOW 中,然后调用:

void csolve(Params paramsIn){
set_defaults(); // Set basic algorithm parameters.
setup_indexing();

params = paramsIn;

printValues(params);

// Solve our problem at high speed!
long num_iters = solve();
// Recommended: check work.converged == 1.

// use_solution(vars);
}

调用 solve() 调用大量使用这些全局变量的函数。我宁愿能够将 Vars、Params、Workspace 和 Settings 作为参数传递给 solve() 但是编写代码的方式,我必须遵循其范例,是它使我们使用这些全局变量.尝试编译此代码时出现的错误是:

$ gcc -fopenmp -shared -Wl,-soname,runSolverParalle -o runSolverParallel.so -fPIC runSolverParallel.c solver.c ldl.c matrix_support.c 
/usr/bin/ld: work: TLS reference in /tmp/cc7BbGwf.o mismatches non-TLS reference in /tmp/ccbUwz29.o
/tmp/ccbUwz29.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

请注意,我将其编译为共享对象,因为我正在使用 cython 和 python 代码发送 parallelSolver 实例化它的数据。当我消除 threadprivate 减速时,它会编译并正常工作(减去由于所有线程使用相同的全局变量而存在的竞争条件)。

编辑:是的,全局变量是一种癌症,处理这个代码库非常令人沮丧。我没有编写底层代码,必须使用它来并行运行一个简单的测试用例。因此完全不值得我花时间重构底层代码库。感谢 Massimiliano 阅读我所说的内容而不是跳上全局变量仇恨列车。

最佳答案

发生的事情很可能是将 threadprivate 子句插入而不是在声明全局变量的 header 内的结果。

事实上,一个翻译单元将变量视为非 TLS(线程本地存储),而另一个将其视为 TLS。这最终会产生链接错误。

解决方案是在声明这些全局变量的 header 中插入 threadprivate 指令(当然要使用该 header 在所有地方声明它们)。

关于c++ - 全局变量外部声明后的 Threadprivate 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089944/

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