融合双for循环时出现段错误

时间:2020-09-26 22:26:35

标签: c for-loop pointers parallel-processing openmp

我已阅读this post,了解如何融合循环。目的是融合我的双for循环,以使其与OpenMP并行化。我之所以不使用collapse(2)是因为内部循环对外部循环有依赖性。我还阅读了相关的post

但是,我的问题是,当我融合循环时,会出现Segmentation Fault错误,这听起来很模糊。我很确定自己进行了正确的转换。不幸的是,我无法提供可重现的方法-最少的示例,因为我的程序具有大量的函数,它们可以相互调用。这是我的初始循环:

for(int i=0; i<size; i++)
{  
    int counter = 0;
    for(int j=0; j<size; j++)
    {
        if (i==j)
            continue;
        if(arr[size * i + j])
        {
          
            graph->nodes[i]->degree++;
            graph->nodes[i]->neighbours[counter] = (Node*)malloc(sizeof(Node));
            graph->nodes[i]->neighbours[counter] = graph->nodes[j];
            counter++;
        }
    }
}

其中graphpointer的{​​{1}},而Struct是指向图形节点的指针数组。 graph->nodes也是如此。指针数组(由另一个指针指向的指针指向-很抱歉)。

您会看到我正在使用graph->nodes[i]->neighbours变量的事实
,这限制了我不能使用counter。在下面,您可以看到我的转换循环:

#pragma omp parallel for collapse(2)

我尝试使用for(int n=0; n<size*size; n++) { int i = n / size; int j = n % size; int counter = 0; for(int j=0; j<size; j++) { if (i==j) continue; if(arr[size * i + j]) { graph->nodes[i]->degree++; graph->nodes[i]->neighbours[counter] = (Node*)malloc(sizeof(Node)); graph->nodes[i]->neighbours[counter] = graph->nodes[j]; counter++; } } } 进行调试,但很奇怪的是valgrind 似乎不在这些特定行上,尽管它仅在以下情况下发生:我进行循环转换。

最小免责声明:您可能会猜到,由于这些指向指针变量的指针,我使用了许多Segmentation Fault

我不希望您使用我发布的代码遇到相同的错误,这就是为什么我的问题更多是笼统的问题:理论上,循环融合如何导致段错误?

1 个答案:

答案 0 :(得分:0)

我认为在您的转换循环中,您将ij混在一起了。

应为int i = n % size;,而不是j

n / size始终等于0。