Сроки Эксперимент - Матрицы
Определите размер матрицы, который вы можете удобно разместить в вашей доступной оперативной памяти. Например, если у вас есть машина на 4 ГБ, вы сможете удобно хранить матрицу, которая занимает около 800 МБ. Сохраните это значение в переменной
Mb
, Используйте следующую информацию для вычисления максимального размера матрицы N, который вы можете хранить в мегабайтах памяти.
Мегабайт имеет
1024
килобайтКилобайт
1024
байтовЧисло с плавающей запятой
8 bytes
,
N × N
матрица содержитN^2
числа с плавающей запятой.Позвоните N, который вы вычисляете
nmax
,(б) создать две случайные матрицы
A
а такжеB
каждый размеромNmax × Nmax
, Использование функций MATLABtic
а такжеtoc
определить, сколько времени (секунд) требуется для вычисления продукта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
Все работает нормально, но я чувствую, что не создаю матрицу для значений A
а также B
, Что я делаю неправильно?
1 ответ
Две основные вещи: вы испортили свое матричное назначение; c:c
где c
константа просто возвращает константу. Двоеточие, :
, создает массивы, такие как
c = 5;
N = 1:c
1 2 3 4 5
Подача оператора двоеточия одной и той же начальной и конечной точки, очевидно, просто возвращает эту точку.
Второе: общее количество операций было пропорционально количеству элементов, а не фактическому результату матричного произведения (что на самом деле не имеет значения, нас интересует только время). Итак, сначала вычислите общее количество операций O с плавающей точкой.
Помните, что мы использовали tic/toc
? Что ж, возможно, мы должны выяснить, какое общее время было, которое хранится в prod_time
, Это количество секунд, которое потребовалось для умножения матрицы. Разделив Totflops
от prod_time
дает вам точку с плавающей точкой O perations 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
Который в моей системе (8 ГБ оперативной памяти и i5 750 2,66 ГГц) дает flops = 1.0617e+10