时间实验 - 矩阵

问题描述 投票:0回答:1

确定可以轻松适应可用RAM的矩阵大小。例如,如果你有一台4 GB的机器,你应该能够舒适地存储占用大约800MB的矩阵。将此值存储在变量Mb中。使用以下信息计算可以存储在Mb兆字节内存中的最大矩阵维数N.

  • 一兆字节有1024千字节
  • 千字节是1024字节
  • 浮点数是8 bytes
  • N × N矩阵包含N^2浮点数。

调用N你计算nmax

(b)创建两个随机矩阵AB,每个矩阵Nmax × Nmax。使用MATLAB函数tictoc,确定计算产品AB所需的时间(秒)。确定计算Nmax × Nmax矩阵 - 矩阵乘积所需的浮点运算(加法和乘法)的数量(2/3)n^3.使用此数字来估计计算机可以执行的每秒浮点运算次数(“flops”)。将此翻牌圈称为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

一切都运行正常,但我觉得我没有为值AB创建一个矩阵。我究竟做错了什么?

matlab matrix flops
1个回答
2
投票

两个主要的事情:你搞砸了你的矩阵任务; c:c,其中c是常数,只返回常量。结肠,:,创建数组,如

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

为冒号操作符提供相同的开始和终点显然只返回该点。

第二:操作总数与元素数量成正比,而不是矩阵乘积的实际结果(实际上是无关紧要的,我们只对时间感兴趣)。因此,首先计算浮点运算的总数。

还记得我们用过tic/toc吗?好吧,也许我们应该找出总时间是多少,它存储在prod_time中。这是执行矩阵乘法所花费的秒数。通过Totflops划分prod_time可以获得每秒操作的FLoating点,即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

© www.soinside.com 2019 - 2024. All rights reserved.