【问题标题】:Segfault when fusing double for-loop融合双for循环时的段错误
【发布时间】: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++;
        }
    }
}

其中graphpointerStructgraph-&gt;nodes 是指向图形节点的指针数组。 graph-&gt;nodes[i]-&gt;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-&gt;nodes[i]-&gt;neighbours[counter] = (Node*)malloc(sizeof(Node)); 的节点分配内存,但下一行将丢弃该内存。
  • @SteveFriedl 这是一个问题。谢谢!我不确定。

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


【解决方案1】:

我认为在您的 converted 循环中,ij 混淆了。

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

n / size 始终等于 0。

【讨论】:

  • 抱歉,事实并非如此。这只是一个错字。我修好了它。这是size*size,所以n/size 并不总是给0。尽管感谢您的注意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多