C 双for回路熔断时的SEG故障
我读过关于如何熔断回路的书。目标是融合我的双C 双for回路熔断时的SEG故障,c,for-loop,pointers,parallel-processing,openmp,C,For Loop,Pointers,Parallel Processing,Openmp,我读过关于如何熔断回路的书。目标是融合我的双for循环,以便与OpenMP并行。我之所以不使用collapse(2),是因为内部循环依赖于外部循环。我也读过这篇相关的文章 然而,我的问题是,当我融合我的循环时,我得到了一个分段错误错误,这听起来很模糊。我很确定我做了正确的转换。不幸的是,我无法提供一个可复制的最小示例,因为我的程序有大量的函数,它们在其中相互调用。以下是我的初始循环: for(int i=0; i<size; i++) { int counter = 0;
for
循环,以便与OpenMP并行。我之所以不使用collapse(2)
,是因为内部循环依赖于外部循环。我也读过这篇相关的文章
然而,我的问题是,当我融合我的循环时,我得到了一个分段错误
错误,这听起来很模糊。我很确定我做了正确的转换。不幸的是,我无法提供一个可复制的最小示例,因为我的程序有大量的函数,它们在其中相互调用。以下是我的初始循环:
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++;
}
}
}
我尝试过使用valgrind
进行调试,最奇怪的是分段错误
似乎不在这些特定行上,,尽管只有在我进行循环转换时才会发生
迷你免责声明:正如您可能猜到的,由于这些指针变量,我使用了大量的malloc
s
我不希望您在我发布的代码中遇到相同的错误,这就是为什么我的问题更一般:理论上,环路融合如何会导致segfault错误?我认为在转换后的环路中,您将I
和j
混在一起
它应该是inti=n%大小代码>,而不是j
n/size
始终等于0。您正在为具有graph->nodes[i]->邻居[counter]=(node*)malloc(sizeof(node))的节点分配内存代码>,但下一行会把内存扔掉。@SteveFriedl,这是个陷阱。谢谢我不确定。对不起,事实并非如此。那只是个打字错误。我修好了。这是size*size
,因此n/size
并不总是给出0
。不过感谢您的注意。
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++;
}
}
}