合計 昨日 今日

メモリの割り当て方について

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ctwb0583
[URL]
Date: 2018年2月04日(日) 19:19
No: 1
(OFFLINE)

 メモリの割り当て方について

プログラム(c言語)に関する質問です。
下記のプログラムが現在計算が止まってしまう状態です。(コンパイルはできる)
個人的には、関数(T)内で非常に大きな配列を確保しているから(スタックオーバーフロー?)だと考えています。
そこでメモリの割り当て方を、静的割り当てから動的割り当てに変更すれば解決するのではないかと考えているのですが、プログラミングについては素人なので現在勉強している途中です。しかし早急に解決しなければならない状態になってしまいました。誠に申し訳ないのですが具体的なプログラムを示していただけないでしょうか。お手数をおかけしますがよろしくお願いいたします。



#include <stdio.h>
#define M 129
#define N 106
#define T 1501
int main ()
{
int i, j, l, n;

double u[T][M][N], v[T][M][N];
double a[T][T], b[T][T];
double X[T][T];
char filename[T];


FILE *fp;
for(l=1; l<T; l++){
sprintf(filename, "U%d.txt", l);
fp = fopen(filename, "r");
printf("read U%d.txt\n",l);
for(i=1; i<M; i++){
for(j=1; j<N; j++){
fscanf(fp, "%lf%lf", &u[l][i][j], &v[l][i][j]);
}
}
}
fclose(fp);



for(n=1; n<T; n++){
for(l=1; l<T; l++){
for(i=1; i<M; i++){
for(j=1; j<N; j++){
a[n][l] += u[n][i][j]*u[l][i][j];
b[n][l] += v[n][i][j]*v[l][i][j];
}
}
}
}
printf("caliculated abc data\n");

for(i=1; i<T; i++){
for(j=1; j<T; j++){
X[i][j] = a[i][j] + b[i][j];
}
}
printf("caliculated X data\n");
FILE *fq;
fq = fopen("matrix.txt", "w");
for(i=1;i<T;i++){
for(j=1;j<T;j++){
fprintf(fq, "%15.15f,\n", X[i][j]);
}
}
fclose(fq);


return 0;
}

Name: ctwb0583
[URL]
Date: 2018年2月04日(日) 19:49
No: 2
(OFFLINE)

 Re: メモリの割り当て方について

codeを囲っていませんでした。大変申し訳ありません。
何卒よろしくお願い致します。
個人的にはメモリを動的割り当てにするために、mallocを使用するのではないかと考えております。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#define M 129
#define N 106
#define T 1501
int main ()
{
    int i, j, l, n;
   
    double u[T][M][N], v[T][M][N];
    double a[T][T], b[T][T];
    double X[T][T];
    char filename[T];
   
 
    FILE *fp;
    for(l=1; l<T; l++){
        sprintf(filename, "U%d.txt", l);
        fp = fopen(filename, "r");
        printf("read U%d.txt\n",l);
            for(i=1; i<M; i++){
                for(j=1; j<N; j++){
                    fscanf(fp, "%lf%lf", &u[l][i][j], &v[l][i][j]);
                }
            }
    }
    fclose(fp);
 
 
 
    for(n=1; n<T; n++){
        for(l=1; l<T; l++){
                for(i=1; i<M; i++){
                    for(j=1; j<N; j++){
                        a[n][l] += u[n][i][j]*u[l][i][j];
                        b[n][l] += v[n][i][j]*v[l][i][j];
                    }
                }
        }
    }
    printf("caliculated abc data\n");
 
 
 
    for(i=1; i<T; i++){
        for(j=1; j<T; j++){
            X[i][j] = a[i][j] + b[i][j];
        }
    }
    printf("caliculated X data\n");
    FILE *fq;
    fq = fopen("matrix.txt", "w");
    for(i=1;i<T;i++){
        for(j=1;j<T;j++){
            fprintf(fq, "%15.15f,\n", X[i][j]);
        }
    }
    fclose(fq);
   
   
    return 0;
}

Name: みけCAT
[URL]
伝説なるハッカー(693,330 ポイント)
Date: 2018年2月04日(日) 19:56
No: 3
(ONLINE)

 Re: メモリの割り当て方について

とりあえず、スタックに割り当てるメモリのサイズを増やすことでごまかすのではダメでしょうか?
Windowsでgccの場合、
コード[Text]: 全て選択
1
-Wl,--stack,536870912
オプションでスタックサイズを指定することができます。
Linuxの場合、
コード[Text]: 全て選択
1
ulimits -s unlimited
コマンドでスタックサイズを無制限にすることができます。

プログラムのスタックサイズを変更する - 忘れたときに備えた記録(2008-12-16)

ちなみに、このプログラムは未初期化の自動変数a, bの要素の値(不定)を34行目や35行目で計算に使っているので、未定義動作になりますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: かずま
[URL]
Date: 2018年2月04日(日) 19:59
No: 4
(OFFLINE)

 Re: メモリの割り当て方について

ctwb0583 さんが書きました:個人的にはメモリを動的割り当てにするために、mallocを使用するのではないかと考えております。

静的の方がいいと思います。
9~11行目の double の前に static を付けてください。
初期化も行われます。
26行目の fclose は、25行目の前に移して、fopen と対応させましょう。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[19人]

cron