Временной эксперимент — матрицы

Определите размер матрицы, который вы можете удобно разместить в доступной оперативной памяти. Например, если у вас есть машина на 4 ГБ, вы сможете с комфортом хранить матрицу, которая занимает около 800 МБ. Сохраните это значение в переменной Mb. Используйте следующую информацию, чтобы вычислить максимальный размер матрицы N, который вы можете хранить в мегабайтах памяти.

  • В мегабайте 1024 килобайта

  • Килобайт — это 1024 байта.

  • Число с плавающей запятой — 8 bytes.

  • Матрица N × N содержит N^2 чисел с плавающей запятой.

Назовите N, который вы вычисляете, nmax.

(b) Создайте две случайные матрицы A и B размером Nmax × Nmax каждая. Используя функции MATLAB tic и 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. Что я делаю неправильно?


person Ryan    schedule 02.03.2018    source источник


Ответы (1)


Две основные вещи: вы перепутали назначение матрицы; c:c, где c — константа, просто возвращает константу. Двоеточие : создает массивы, например

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

Очевидно, что передача оператору двоеточия одной и той же начальной и конечной точки просто возвращает эту точку.

Во-вторых: общее количество операций было пропорционально количеству элементов, а не фактическому результату матричного произведения (что на самом деле не имеет значения, нас просто интересует время). Итак, сначала подсчитайте общее количество операций FLточки плавания O.

Помните, что мы использовали tic/toc? Что ж, возможно, нам следует выяснить, какое общее время хранится в prod_time. Это количество секунд, которое потребовалось для выполнения матричного умножения. Разделив Totflops на prod_time, вы получите FLточку плавления Oопераций Per 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

person Adriaan    schedule 02.03.2018