前提・実現したいこと
構造体を要素として持つ大規模な配列において、その構造体に所属する配列の動的割付けを行うことで、メモリの使用量を削減しようと試み下に示すテストプログラムを作成しました。
倍精度実数型を要素としてもつ配列の要素数が12、そしてその配列をもつ構造体配列の要素数が1398101なので、if(mod(i,10))なしでは、メモリ使用量は8byte121398101 = 134.217696MBであると予想をたてました。しかし、実際には291MBとなりました。なおallocateする前ではメモリ使用量は405KBとなっていました。この計算と違う結果になった点がまず一つ目の疑問です。
次にallocateする配列を1/10にしたらメモリ使用量は1/10になるのかと思いましたが、実際には結果は1/10ではなくて194MBとなりました。この1/10にならない理由が2つ目の疑問です。
C言語でも同様のプログラムを書いてみたのですが、今度は14MBと非常に少ないという結果になってしまいました。メモリの使用量というのはそもそもこのように概算することはできないものなのでしょうか?
コンパイラはintel fortran 19.1.1.216を用いています。
該当のソースコード
fortran
1program testff 2 type :: Test 3 real(8),allocatable :: values(:) 4 end type Test 5 6 type(Test),allocatable :: te(:) 7 8 integer :: i 9 integer :: nt = 12 10 integer :: n = 1398101 11 12 allocate(te(n)) 13 14 do i = 1, n 15 !allocate(te(i)%values(nt)) 16 if(mod(i,10)) then 17 allocate(te(i)%values(nt)) 18 te(i)%values = 0.d0 19 end if 20 end do 21 22 call sleep(30) ! メモリの使用量を確認するための時間 23 24end program
c
1#include <stdio.h> 2 3int main(){ 4 struct test { 5 double *value; 6 }; 7 8 int n = 1398101; 9 int nt = 12; 10 int i,j; 11 struct test *te; 12 13 te = malloc(sizeof(struct test) * n); 14 15 for (i=0; i<n; i++){ 16 te[i].value = malloc(sizeof(double) * nt); 17 for (j=0; j<nt; j++){ 18 te[i].value[j] = 0.0; 19 } 20 } 21 22 sleep(30); 23}
追記(2020.10.1): C言語に関しては最適化によって使用してないメモリは削除されてしまっていたようで、最適化をオフにしたら想定通りの結果を得られました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/01 01:54 編集
2020/10/03 11:17