时序实验 - 矩阵



确定一个你可以舒适地适应你的矩阵大小 可用内存。例如,如果您有一台 4 GB 的计算机,您应该 能够舒适地存储占用约800MB的矩阵。 将此值存储在变量Mb中。使用以下信息执行以下操作 计算可以存储的最大矩阵维数 N(以 Mb 为单位) 兆字节的内存。

  • 一兆字节有1024千字节

  • 一千字节是1024字节

  • 浮点数为8 bytes

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

调用您计算的 Nnmax

(b) 创建两个随机矩阵AB每个矩阵的大小Nmax × 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的值创建矩阵。我做错了什么?

两件主要的事情:你搞砸了你的矩阵分配;c:cc是常量的地方,只返回常量。冒号:创建数组,例如

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

向冒号运算符提供相同的开始和终点显然只会返回该点。

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

还记得我们用过tic/toc吗?好吧,也许我们应该找出存储在prod_time中的总时间是多少.这是执行矩阵乘法所花费的秒数。将Totflops除以prod_time得到FLOperationsPer 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

相关内容

  • 没有找到相关文章

最新更新