时间实验 - 矩阵

时间:2018-03-02 08:41:15

标签: matlab matrix flops

  

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

     
      
  • 兆字节有1024千字节

  •   
  • 千字节为1024字节

  •   
  • 浮点数为8 bytes

  •   
  • N × N矩阵包含N^2个浮点数。

  •   
     

调用您计算的N nmax

     

(b)创建两个大小为A的随机矩阵BNmax × Nmax。   使用MATLAB函数tictoc,确定多长时间   (秒)计算产品AB。确定数量   它需要浮点运算(加法和乘法)   计算Nmax × Nmax矩阵 - 矩阵乘积(2/3)n^3.使用   这个数字来估计每个浮点运算的数量   第二个('翻牌')你的电脑可以执行。拨打这个翻牌价   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创建矩阵。我做错了什么?

1 个答案:

答案 0 :(得分:2)

两件主要的事情:你搞砸了你的矩阵作业;其中c:c是常量的c只返回常量。冒号:创建数组,例如

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

为冒号操作符提供相同的start-和endpoint显然只返回该点。

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

还记得我们使用过tic/toc吗?好吧,也许我们应该找出总时间是多少,它存储在prod_time中。这是执行矩阵乘法所花费的秒数。将Totflops除以prod_time会为您提供 FL oating点 O 操作 P er S 第二,即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