0

使用可能な RAM に快適に収まるマトリックス サイズを決定します。たとえば、4 GB のマシンを使用している場合、約 800 MB を占めるマトリックスを問題なく格納できるはずです。この値を変数に格納しますMb。次の情報を使用して、Mb メガバイトのメモリに格納できる行列の最大次元 N を計算します。

  • メガバイトには1024キロバイトがある

  • キロバイトは1024バイト

  • 浮動小数点数は8 bytes.

  • N × N行列にはN^2浮動小数点数が含まれます。

計算した N を呼び出しますnmax

(b) 2 つの乱数行列ABそれぞれのサイズを作成しますNmax × Nmax。MATLAB 関数ticとを使用しtocて、積 の計算にかかる時間 (秒) を決定しますABNmax × Nmax行列と行列の積を計算するために必要な浮動小数点演算 (加算と乗算) の数を決定し(2/3)n^3.ます。この数値を使用して、コンピューターが実行できる 1 秒あたりの浮動小数点演算 (「フロップ」) の数を推定します。これをフロップレートと呼びます flops

% Part A
nmax = sqrt((1600*1024*1024)/8); % 8GB of RAM

% Part B
A = (nmax:nmax);
B = (nmax:nmax);

tic 
prod = A*B;
prod_time = toc

flops = (2/3)*(prod).^3

Aすべて正常に動作しますが、値とのマトリックスを作成していないように感じますB。私は何を間違っていますか?

4

1 に答える 1

2

2 つの主な事柄: 行列の割り当てを台無しにしました。c:cwhere cis a constant は定数を返すだけです。コロン ,は、次のような配列:を作成します

c = 5;
N = 1:c
    1  2  3  4  5

コロン演算子に同じ開始点と終点を与えると、明らかにそのポイントが返されます。

2 番目: 操作の総数は、行列積の実際の結果ではなく、要素の数に比例していました (これは実際には関係ありません。時間に関心があるだけです)。したがって、最初にFL浮動小数点O操作の総数を計算します。

を使用したことを覚えていtic/tocますか? おそらく、合計時間が何であったかを調べる必要があります。これは に格納されていprod_timeます。これは、行列の乗算を実行するのにかかった秒数です。Totflopsで割るprod_timeと、FL oating point Operations Per Second、つまり FLOPSが得られます。


[~,systemview] = memory; % Get RAM info
tmp = systemview.PhysicalMemory;
% tmp.Total stores the total system RAM

Mb = 0.2*((tmp.Total/(1024^2))); % 20% of the total RAM

% floor your nmax to force it to be integer
nmax = floor(sqrt((Mb*1024^2/8))); % create your nmax

A = rand(nmax); % random nmax x nmax matrix
B = rand(nmax); % random nmax x nmax matrix

tic
prod = A*B;
prod_time = toc;

% Total flops
Totflops = (2/3)*(nmax).^3;

flops = Totflops/prod_time; % flops/sec

私のシステム(8GB RAMとi5 750 2.66GHz)では、flops = 1.0617e+10

于 2018-03-02T09:05:40.987 に答える