Ограничения: время – 250ms/500ms, память – 128MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Сравнить время умножения матриц размером `1000 xx 1000`, меняя порядок циклов всеми 6 способами для уровня оптимизации ``-O3``
```c++
#include <vector>
#include <iostream>
#include <chrono>
#include <utility>
#include <stdexcept>
using namespace std;
class Matrix {
int n,m;
vector<vector<double>> data;
public:
Matrix(int n, int m):n(n),m(m),data(n,vector<double>(m,0.0)) {}
friend Matrix operator*(const Matrix &a, const Matrix &b);
pair<int,int> size() const { return {n,m}; }
};
Matrix operator*(const Matrix &a, const Matrix &b) {
if (a.m!=b.n) throw runtime_error("неверные размеры");
Matrix c(a.n,b.m);
for (int i = 0; i < c.n; i++)
for (int j = 0; j < c.m; j++)
for (int k = 0; k < a.m; k++)
c.data[i][j]+=a.data[i][k]*b.data[k][j];
return c;
}
int main()
{
Matrix a(1000,1000),b(1000,1000);
auto start = std::chrono::high_resolution_clock::now();
Matrix c=a*b;
auto end = std::chrono::high_resolution_clock::now();
std::cout << "ijk " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count() << "\n";
}
```
В качестве решения отправить текстовый файл с таблицей, в которой будет указан порядок выполнения
циклов в порядке увеличения времени и время выполнения в мкс.
```sample Пример текстового файла
ijk 100000
ikj 100001
jik 100002
jki 100003
kij 100004
kji 200000
```