我有以下代码:
[...]
#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),我从来没有。
由于
答案 0 :(得分:1)
根据OpenMP规范(链接?),task
子句不是单个区域的一部分。因此,它可以比tForTasks
数组更长久并在其销毁后运行。因此,当您声明它shared
时,任务可以引用未初始化或取消分配的内存引发分段错误。省略shared
规范时,数组将作为firstprivate
复制到每个任务,因为它是在并行区域中声明的。但在这种情况下,线程不会从其他线程看到对tForTasks
的写入。
一种解决方案是动态分配数组并在任务完成后释放它。