gpt4 book ai didi

c - 在 OpenMP 中将结构体指针定义为 threadprivate

转载 作者:行者123 更新时间:2023-11-30 15:06:40 25 4
gpt4 key购买 nike

我从 C 调用一段 Fortran 代码,然后再调用一些其他 C 代码。为了调用 C 代码的最后一位,我需要有两个全局指针,分别指向我定义的 EarthModel 结构和 SurveyGeometry 结构。我尝试在 calcGreen.c 中并行化下面的 for 循环,但由于线程超过 1 个而未成功(程序段错误)。

我需要每个线程都有自己的指向不同 EarthModels 和 SurveyGeometrys 的指针,同时保留全局定义。我尝试使用 omp threadprivate 指令为每个线程提供自己的结构指针,它可以分配和释放并维护线程级别的全局定义。我还了解到,创建线程的默认堆栈为 2M,因此我尝试通过设置环境变量 export OMP_STACKSIZE=512M(或更高)来为线程提供更多内存,但段错误仍然存​​在。

shared.h

extern EarthModel *g_em;
extern SurveyGeometry *g_sg;
#pragma omp thradprivate(g_em, g_sg)

util.h

#include "shared.h"

EarthModel *g_em;
SurveyGeometry *g_sg;

calcGreen.c

#include "util.h"

...
omp_set_num_threads(2);
#pragma omp parallel for schedule(dynamic,1)
for(int ii=0; ii<nseg; ++ii){
for(int jj=0; jj<nseg; ++jj){
...
// code to allocate and initialize g_sg and g_em
g_sg = initSG();
g_em = initEM();
// code to pass through to Fortran and execute C function on g_sg and g_em
// code to free g_sg and g_em
freeSG(g_sg);
freeEM(g_em);
...
}
}
...

编辑:或者,有没有办法从第一个 C 函数获取结构 g_sg 和 g_em,其中分配并设置为 Fortran 以线程安全方式调用的 C 函数,而不使用全局变量?

最佳答案

不完全确定为什么会这样,但正确拼写“threadprivate”并将 #pragma omp threadprivate 指令移动到 util.h 似乎已经成功了。第一个并不令人惊讶,但第二个对我来说并不直观。感谢您的帮助。

关于c - 在 OpenMP 中将结构体指针定义为 threadprivate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38886262/

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