C 使用omp parallel(但不是按顺序)时出现分段错误

C 使用omp parallel(但不是按顺序)时出现分段错误,c,parallel-processing,openmp,libgomp,C,Parallel Processing,Openmp,Libgomp,我在使用#pragma omp并行程序进行 基本上,我有几百个DNA序列,我想对一个叫做NNLS的算法运行 我认为并行执行会给我一个很好的加速,所以我应用了#pragma操作符 当我按顺序运行它时,没有问题,结果很好,但是当我使用#pragma omp parallel运行它时,我在算法中得到一个segfault(有时在不同的点) #pragma omp parallel for 对于(int i=0;i数据项名称,“…”)==0 | | strcmp(目录项->数据项名称,“.”==0){ 继

我在使用#pragma omp并行程序进行

基本上,我有几百个DNA序列,我想对一个叫做NNLS的算法运行

我认为并行执行会给我一个很好的加速,所以我应用了#pragma操作符

当我按顺序运行它时,没有问题,结果很好,但是当我使用#pragma omp parallel运行它时,我在算法中得到一个segfault(有时在不同的点)

#pragma omp parallel for
对于(int i=0;i数据项名称,“…”)==0 | | strcmp(目录项->数据项名称,“.”==0){
继续;
}
sprintf(文件名,“%s/%s”,输入\u fasta\u目录,目录\u条目->d\u名称);
double*count\u matrix=加载\u count\u matrix(文件名、宽度、公里数);
//规格化_矩阵(计数_矩阵,1,宽度)
对于(z=0;z
gdb总是在我的线程中以不同的品脱退出,所以我无法找出哪里出了问题

我所尝试的:

  • 为每个矩阵分配一份副本,这样它们就不会相互重叠
  • 对#pragma片段混合使用私有/共享运算符
  • 使用不同的输入序列
  • 在调用NNL之前,写出我的训练矩阵和计数矩阵,确保它们看起来正常。(他们有!)
我有点不知所措。有人有什么建议吗?

定义“#pragma omp parallel for”并不能满足您的需求。根据你的算法,你必须有一个坚实的计划,在处理器之间哪些变量是共享的,哪些是私有的

看看这一点,您应该可以快速了解如何在线程之间正确地共享工作


根据您的陈述“我在算法中得到一个segfault(有时在不同的点)”,我认为线程之间存在竞争条件或变量初始化不当。

函数readdir不是线程安全的。引用readdir(3)的Linux手册页:

考虑将对readdir的调用放在一个关键部分中。在离开临界区之前,将readdir()返回的文件名复制到本地临时变量,因为进入临界区的下一个线程可能会覆盖它


也考虑用临界区段保护输出操作,否则来自不同线程的输出可能会混杂在一起。

解决方案:确保在多线程(函数F2C翻译器)

时,在函数中不使用静态变量。很可能的原因是堆栈限制。正如MutantTurkey提到的,如果您有很多静态变量(比如子例程中定义的巨大数组),它们可能会耗尽堆栈

要解决这个问题,首先运行
ulimit-s
,检查进程的堆栈限制。您可以使用
ulimit-s unlimited
将其设置为ulimited。然后,如果它仍然崩溃,尝试通过将
OMP\u STACKSIZE
环境变量设置为一个大值来增加OPENMP的堆栈,如
100MB


英特尔公司在伦敦举行了一次讨论会。它有更多关于堆栈和堆内存的信息。

据我所知,本地声明的变量是自动私有的。即使添加共享(训练的_矩阵)也不能解决问题。谢谢你的快速报道,真是太棒了!gdb并不表示错误在readdir中,并且文件被正确读取,错误实际上在算法调用中
The data returned by readdir() may be overwritten by subsequent  calls  to  readdir()
for the same directory stream.