我已阅读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++;
}
}
}
其中graph
是pointer
的{{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
。
我不希望您使用我发布的代码遇到相同的错误,这就是为什么我的问题更多是笼统的问题:理论上,循环融合如何导致段错误?
答案 0 :(得分:0)
我认为在您的转换循环中,您将i
和j
混在一起了。
应为int i = n % size;
,而不是j
。
n / size
始终等于0。