0

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

  • 一兆字节有1024千字节

  • 一千字节是1024字节

  • 一个浮点数是8 bytes

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

调用您计算的 N nmax

(b) 创建两个随机矩阵AB每个矩阵的大小为Nmax × Nmax。使用 MATLAB 函数tictoc,确定计算乘积 所需的时间(秒)ABNmax × 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. 我究竟做错了什么?

4

1 回答 1

2

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

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

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

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

还记得我们用过tic/toc吗?好吧,也许我们应该找出总时间是多少,它存储在prod_time. 这是执行矩阵乘法所需的秒数。除以FLTotflops oating point O perations Per Sprod_time econd ,即 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 回答