2

全部!来自意大利的打字 如果矩阵大小小于 800 并且因分段错误而失败,则此小段代码有效。似乎问题出在堆栈大小......我该如何增加它?如何解决更大矩阵尺寸的问题?代码在串行放置中运行良好,在并行执行中失败。谢谢。

#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

4 回答 4

2

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

于 2008-11-24T10:21:23.793 回答
2

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

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

于 2008-11-24T10:55:26.330 回答
0

OpenMP 线程是使用由 OMP_STACKSIZE 环境变量定义的堆栈大小创建的(这是从 OpenMP 3.0 开始的标准)。如果环境变量不存在,则默认堆栈大小是特定于实现的。您可能宁愿将堆用于如此大的分配,但是想要更改 OpenMP 线程的堆栈大小可能有正当理由。

于 2012-02-14T16:39:46.190 回答
0

您可以通过外壳调整堆栈大小

'ulimit -s newstacksize'

-- 尝试 1000000

于 2008-12-31T16:16:34.850 回答