Сроки Эксперимент - Матрицы

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

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

  • Килобайт 1024 байтов

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

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

Позвоните N, который вы вычисляете nmax,

(б) создать две случайные матрицы 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, Что я делаю неправильно?

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

Другие вопросы по тегам