2

全て!イタリアからのタイピング この小さなコードは、行列のサイズが 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

4 に答える 4

2

OpenMP のデフォルトのスタック サイズは 4 ~ 8 MB です。変更できる STACKSIZE という環境変数があります (たとえば、16 MB の 16384 に変更します)。この PDFの第 5-5 章を参照してください。

于 2008-11-24T10:21:23.793 に答える
2

本当にスタックに行列を割り当てる必要がありますか?

代わりにヒープを使用できます。大量のメモリの場合は、さらに効率的です (アロケータの実装では、割り当てを解除したときにメモリをオペレーティング システムに解放できる匿名 mmap などを使用できます)。

于 2008-11-24T10:55:26.330 に答える
0

シェルを介してスタックサイズを調整できます

'ulimit -s newstacksize'

-1000000を試してください

于 2008-12-31T16:16:34.850 に答える
0

OpenMP スレッドは、OMP_STACKSIZE 環境変数で定義されたスタック サイズで作成されます (これは OpenMP 3.0 以降の標準です)。環境変数が存在しない場合、デフォルトのスタック サイズは実装固有です。おそらく、このような大規模な割り当てにはヒープを使用する必要がありますが、OpenMP スレッドのスタック サイズを変更する正当な理由がある場合があります。

于 2012-02-14T16:39:46.190 に答える