c - 我想用 openMP 并行化这个函数,但我有一个 'segmentation fault (core dumped)' 。怎么了?

标签 c multithreading parallel-processing segmentation-fault openmp

这是 LAME 编码器的一个函数,当我与 #pragma omp 并行化时,结果是核心转储;我应该如何并行化这个函数?

我认为指针是 OpenMP 的问题,线程增加了错误的内存地址。

static void quantize_lines_xrpow(unsigned int l, FLOAT istep, const FLOAT * xp, int *pi)
{
  fi_union *fi;
  unsigned int remaining;
  int i;
  assert(l > 0);

  fi = (fi_union *) pi;

  l = l >> 1;
  remaining = l % 2;
  l = l >> 1;
  double x0,x1,x2,x3;
  #pragma omp parallel for private(i)

  for(i=l;i>0;i--){//while (l--) {
      x0 = istep * xp[0];
      x1 = istep * xp[1];
      x2 = istep * xp[2];
      x3 = istep * xp[3];

    x0 += MAGIC_FLOAT;
    fi[0].f = x0;
    x1 += MAGIC_FLOAT;
    fi[1].f = x1;
    x2 += MAGIC_FLOAT;
    fi[2].f = x2;
    x3 += MAGIC_FLOAT;
    fi[3].f = x3;

    fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT];
    fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT];
    fi[2].f = x2 + adj43asm[fi[2].i - MAGIC_INT];
    fi[3].f = x3 + adj43asm[fi[3].i - MAGIC_INT];

    fi[0].i -= MAGIC_INT;
    fi[1].i -= MAGIC_INT;
    fi[2].i -= MAGIC_INT;
    fi[3].i -= MAGIC_INT;
    fi += 4;
    xp += 4;
};
if (remaining) {
    double  x0 = istep * xp[0];
    double  x1 = istep * xp[1];

    x0 += MAGIC_FLOAT;
    fi[0].f = x0;
    x1 += MAGIC_FLOAT;
    fi[1].f = x1;

    fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT];
    fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT];

    fi[0].i -= MAGIC_INT;
    fi[1].i -= MAGIC_INT;
  }
}

最佳答案

线程之间有许多共享变量,x0、x1、x2、x3、fi、xp,这会导致大量数据竞争。这包括指针(数组)fixp。线程不确定地增加这些,因此任何取消引用都是错误的。

关于c - 我想用 openMP 并行化这个函数,但我有一个 'segmentation fault (core dumped)' 。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590398/

相关文章:

c - 服务器无法接受来自多个客户端的消息?

c - 神经网络反向传播问题

c++ - 双重锁定解决方法

java - 寻找在多线程平台上创建用户名的好方法

java - 线程再增加 1 时未完成 Java

c - MPI 错误 : (Segmentation fault: 11)

c - 寻址非整数地址和 sse

c - fork() 和改变局部变量?

C# 单例模式在实现并行而不是并发处理后未按预期工作

java - JVM退出后守护线程如何存活?