gpt4 book ai didi

c - OpenMP 范围界定 - 段。共享错误()

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:57 25 4
gpt4 key购买 nike

我有以下代码:

[...]

#pragma omp parallel
{
#pragma omp single firstprivate(nodes)
{

[...] /* Do some calculation to find out the value of "nodes" */

double *tForTasks[nodes];

for(node=0; node < nodes ; node++){

#pragma omp task private(l, k ,j) shared(tForTasks)
{
[...] /* Piece of iterative kernel that writes on tForTasks and on private data structures */
}
}
}

[...]

而且我发现将 tForTasks 定义为共享会导致段错误,但是从任务声明中取出 shared(tForTasks) 就可以了。我做错了什么吗?

我没有提供更多代码,因为它似乎与问题无关(如果需要,请告诉我)。我有 1 到 16 之间任意数量线程的段错误。没有 shared(tForTasks),我永远不会有它。

谢谢

最佳答案

根据 OpenMP 规范(链接?),task 子句不是 single 区域的一部分。因此,它可以比 tForTasks 数组长寿并在其销毁后运行。因此,当您将其声明为 shared 时,任务可以引用未初始化或解除分配的内存,从而引发段错误。当您省略 shared 规范时,数组将作为 firstprivate 复制到每个任务,因为它是在并行区域中声明的。但在这种情况下,一个线程将看不到其他线程对 tForTasks 的写入。

一种解决方案是动态分配数组并在任务完成后释放它。

关于c - OpenMP 范围界定 - 段。共享错误(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23515380/

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