C 使用omp parallel(但不是按顺序)时出现分段错误
我在使用#pragma omp并行程序进行 基本上,我有几百个DNA序列,我想对一个叫做NNLS的算法运行 我认为并行执行会给我一个很好的加速,所以我应用了#pragma操作符 当我按顺序运行它时,没有问题,结果很好,但是当我使用#pragma omp parallel运行它时,我在算法中得到一个segfault(有时在不同的点)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 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之前,写出我的训练矩阵和计数矩阵,确保它们看起来正常。(他们有!)
根据您的陈述“我在算法中得到一个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.