【问题标题】:openMP for loop Segmentation fault (core dumped)openMP for loop 分段错误(核心转储)
【发布时间】:2020-03-16 19:54:14
【问题描述】:

我最近开始学习 openMP,我正在尝试并行化我的卷积代码。一旦我将#pragma 添加到初始化图像数组并且没有数据依赖性的for循环中,代码就会中断并引发分段错误(核心转储)。我不知道出了什么问题。请帮忙!

  // map values from original image to padded image
#pragma omp parallel for schedule(static)  
  for (size_t j = 0; j < n * n; j++) {
    size_t row = (j / n) + padding;
    size_t col = (j % n) + padding;
    size_t pos = (n + (padding * 2)) * row + col;
    padded_image[pos] = image[j];
  }

【问题讨论】:

  • output 在哪里分配/声明?添加(或删除)代码,突然之间没有明显原因的事情发生了,具有内存损坏的所有特征。
  • 您应该为函数提供输入。似乎您的段错误发生是因为您正在访问不属于您的内存。
  • 输出分配在另一个文件的 main() 中。代码在顺序版本中运行,但在并行版本中中断

标签: c++ openmp


【解决方案1】:

计算的索引与分配的大小不匹配。 实际上,分配数组padded_image 的大小不依赖于n,而在目标循环中对相同数组的访问则依赖于n。 关于循环,数组的大小大概应该是:(n + (padding * 2)) * (n + (padding * 2))

请注意padded_image 不会被删除。 此外,模数非常慢,请考虑使用带有 OpenMP 子句collapse(2) 的两个循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多