使用OMP进行分段故障

时间:2008-11-24 10:16:52

标签: stack overflow openmp

一切!从意大利打字 如果矩阵大小小于800,那么这段小代码就可以工作,并且对于更大的大小而言,这会失败并出现分段错误.... 我已经尝试过使用linux中的gcc 4.3.2编译器和windows中的macosx和VisualStudio编译器。 看来问题在于堆栈大小.....我怎样才能增加它? 如何解决更大矩阵尺寸的问题? 代码在串行执行中工作正常并行执行失败。  感谢。

#include <omp.h>
#include <stdio.h>
#define Nu 4000
int main() {
float A[Nu][Nu],B[Nu][Nu],C[Nu][Nu];
int i,j;
#pragma omp parallel
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
#pragma omp parallel for private(j,i) shared(A,B,C) schedule(static)
for(j=0;j<Nu;j++){
for(i=0;i<Nu;i++){
//printf("Hello from thread %d, i,j %d %d\n", omp_get_thread_num(),i,j );
A[i][j]=0;
B[i][j]=0;
C[i][j]=0;

}}

}

4 个答案:

答案 0 :(得分:2)

OpenMP中的默认堆栈大小为4-8 MB。您可以更改一个名为STACKSIZE的环境变量(例如,更改为16384,即16 MB)。见this PDF的第5-5章。

答案 1 :(得分:2)

你真的必须在堆栈上分配矩阵吗?

您可以改用堆。对于大量内存,它甚至可以更高效(分配器实现可以使用诸如匿名mmap之类的东西,允许在释放内存时将内存释放回操作系统)。

答案 2 :(得分:0)

您可以使用

通过shell调整堆栈大小

'ulimit -s newstacksize'

- 尝试1000000

答案 3 :(得分:0)

使用OMP_STACKSIZE环境变量定义的堆栈大小创建OpenMP线程(这是OpenMP 3.0的标准配置)。如果环境变量不存在,则默认堆栈大小是特定于实现的。你可能更应该使用堆来进行如此大的分配,但是想要改变OpenMP线程的堆栈大小可能有合理的理由。