【发布时间】:2021-01-12 21:47:04
【问题描述】:
我已阅读 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 到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 似乎不在这些特定行上,虽然它只在我创建循环时发生转化。
迷你免责声明:你可能猜到了,因为这些指向指针变量的指针,我使用了很多 mallocs。
我不希望您在我发布的代码中遇到同样的错误,这就是为什么我的问题更笼统的原因:理论上循环融合如何导致段错误?
【问题讨论】:
-
您正在为具有
graph->nodes[i]->neighbours[counter] = (Node*)malloc(sizeof(Node));的节点分配内存,但下一行将丢弃该内存。 -
@SteveFriedl 这是一个问题。谢谢!我不确定。
标签: c for-loop pointers parallel-processing openmp