{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using LinearAlgebra" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Complexity of Matrix Operations\n", "\n", "With a little effort, we can figure out that the **number of arithmetic operations** for an $n\\times n$ matrix **scales proportional to** (for large $n$):\n", "\n", "* $n$ for vector operations: vector addition $x\\pm y$, scaling $\\alpha x$, dot products $x^T y$\n", "* $n^2$ for: matrix `*` vector $Ax$, or solving a *triangular* system like $Ux=c$ or $Lc=b$ (back/forward substitution)\n", "* $n^3$ for: matrix `*` matrix $AB$, LU factorization $PA=LU$, or solving a triangular system with $n$ right-hand sides like computing $A^{-1}$ from the LU factorization.\n", "\n", "(In computer science, we would say that these have “complexity” $\\Theta(n^2)$ and $\\Theta(n^3)$, respectively.\n", "\n", "Let's see how these predictions match up to reality:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "using BenchmarkTools # a useful Julia package for performance benchmarking" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Measure the time for LU factorization of 10×10, 100×100, 500×500, 1000×1000, and 2000×2000 random real (double precision) matrices:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5-element Vector{Float64}:\n", " 6.25e-7\n", " 5.0292e-5\n", " 0.002477292\n", " 0.016567125\n", " 0.121252792" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = [10,100,500,1000,2000]\n", "LinearAlgebra.BLAS.set_num_threads(1) # benchmarking on multiple cores is weird\n", "t = [@belapsed(lu($(rand(n,n))), evals=1) for n in n]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's plot it on a log–log scale to see if it is the expected $n^3$ power law:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHJCAYAAABtzYa7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB1vElEQVR4nO3dd3yN9/vH8ddJZEjsFVKCtvYIIka+Yra21qxRs/RblSpVVapqtKotVVpBVStmjBbtF61qzaL2rNZqzMYmISGR5P79cf+cCkJk3Rnv5+NxHtyfc+e+r3M4zuWzLpthGAYiIiIiWYiD1QGIiIiIpDUlQCIiIpLlKAESERGRLEcJkIiIiGQ5SoBEREQky1ECJCIiIlmOEiARERHJcpQAiYiISJajBEhERESyHCVAImlky5YtjBo1imvXrt33XP369alfv36ax/Qwv/76K9WrV8fd3R2bzcby5ctT7V4nTpzAZrMxYcKEBM8pUaIELVu2fOBzO3fuxGazERQU9Mh7pfbrioyMZNSoUaxfvz5Fr3tHUFAQNpuNEydOpMr1V61axahRox74XIkSJejZs2eq3FckrWWzOgCRrGLLli2MHj2anj17kidPnnjPTZ061ZqgEmAYBi+88AKlS5fmhx9+wN3dnTJlylgdVrKlxeuKjIxk9OjRAKmS1LZo0YKtW7dSpEiRFL82mAlQYGDgA5OgZcuWkStXrlS5r0haUwIkkg6UL1/e6hDi+eeff7hy5Qpt2rShUaNGKXLNmzdv4urqis1mS5HrJUVqvK60cuf9K1iwIAULFrQkhqpVq1pyX5HUoCEwkTQwatQo3nrrLQBKliyJzWbDZrPZh0nuHQK7MyQ0fvx4Pv74Y0qUKEH27NmpX78+R44c4fbt2wwdOhRPT09y585NmzZtuHDhwn33XbRoEbVr18bd3Z0cOXLQpEkT9uzZ88hYixYtCsDbb7+NzWajRIkS9ud/++03GjVqRM6cOXFzc8PPz4+VK1fGu8adYZqff/6Zl156iYIFC+Lm5kZUVFQS3r2U8bDXdezYMXr16kWpUqVwc3PjiSeeoFWrVhw4cOC+61y7do0333yTJ598EhcXFwoVKkTz5s3566+/OHHihD05GT16tP3P+e5ho+S+f/cOga1fv95+n3sfd/+5LVq0iMaNG1OkSBGyZ89OuXLlGDp0KBEREfZzevbsSWBgIEC869y514OGwE6dOkXXrl0pVKgQLi4ulCtXjk8//ZS4uDj7OXcPcU6cOJGSJUuSI0cOateuze+//57oP0ORlKQeIJE00KdPH65cucIXX3zB0qVL7cMXj+r5CQwMpHLlygQGBtq/eFu1akXNmjVxcnLim2++4eTJkwwePJg+ffrwww8/2H/2ww8/5N1336VXr168++67REdHM378ePz9/dm+fXuC9+7Tpw/e3t60bduW/v3706VLF1xcXADYsGEDzz77LJUrV+brr7/GxcWFqVOn0qpVK4KDg+nYsWO8a7300ku0aNGCuXPnEhERgZOTU3LexmR52Ov6559/yJ8/Px999BEFCxbkypUrzJ49m5o1a7Jnzx77MNn169epU6cOJ06c4O2336ZmzZrcuHGDjRs3Ehoaip+fHz/99BNNmzald+/e9OnTB8CeFKXG+1etWjW2bt0ar+3o0aP07t2bChUqxGtr3rw5AwcOxN3dnb/++ouPP/6Y7du3s3btWgBGjBhBREQE3377bbxrJjTcdvHiRfz8/IiOjub999+nRIkSrFixgsGDB3P8+PH7hnYDAwMpW7YskyZNst+vefPmhISEkDt37of/AYqkNENE0sT48eMNwAgJCbnvuXr16hn16tWzH4eEhBiA4e3tbcTGxtrbJ02aZADGc889F+/nBw4caABGWFiYYRiGcerUKSNbtmxG//794513/fp1o3DhwsYLL7zw0Fjv3H/8+PHx2mvVqmUUKlTIuH79ur0tJibGqFixolG0aFEjLi7OMAzDmDVrlgEY3bt3f+h9HnW/uxUvXtxo0aLFA5/bsWOHARizZs1K9n0Mw3xN0dHRRqlSpYw33njD3j5mzBgDMNasWZPgz168eNEAjJEjR973XEq8f3eee9DfI8MwjPPnzxtPPvmkUaFCBePq1asPPCcuLs64ffu2sWHDBgMw9u3bZ38uICDASOiroXjx4kaPHj3sx0OHDjUAY9u2bfHOe/XVVw2bzWYcPnzYMIx/3/dKlSoZMTEx9vO2b99uAEZwcPAD7yeSmjQEJpKONW/eHAeHfz+m5cqVA8yJsHe7037q1CkAVq9eTUxMDN27dycmJsb+cHV1pV69eklaoRQREcG2bdto3749OXLksLc7OjrSrVs3zpw5w+HDh+P9TLt27R77PlaIiYnhww8/pHz58jg7O5Mt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", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "PyObject Text(0.5, 1.0, 'time for LU factorization')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using PyPlot\n", "loglog(n, t*1e9, \"bo-\")\n", "loglog(n, n.^3, \"k--\")\n", "xlabel(\"matrix size n\")\n", "ylabel(\"time (ns)\")\n", "legend([\"time\", L\"n^3\"])\n", "title(\"time for LU factorization\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's pretty close! For large $n$, you can see it starting to go parallel to the $n^3$ line.\n", "\n", "Let's also look at the time to *solve* $LUx=b$ when we are *given* the LU factors, which we predict should grow $\\sim n^2$:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5-element Vector{Float64}:\n", " 2.274989733059548e-7\n", " 2.4583333333333337e-6\n", " 5.1166e-5\n", " 0.000201208\n", " 0.001118792" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = [@belapsed($(lu(rand(n,n))) \\ $(rand(n))) for n in n]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "PyObject Text(0.5, 1.0, 'time for LU solve')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "loglog(n, ts*1e9, \"bo-\")\n", "loglog(n, n.^2, \"k--\")\n", "xlabel(\"matrix size n\")\n", "ylabel(\"time (ns)\")\n", "legend([\"time\", L\"n^2\"])\n", "title(\"time for LU solve\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yup, it's pretty close to the $n^2$ growth! The key point is that, unless you have many ($\\gtrsim n$) right-hand sides, most of the effort is spent in Gaussian elimination (finding L and U), *not* in the back/forward-substitution to solve $LUx=b$.\n", "\n", "If we believe this scaling, how long would it take for my laptop to solve a $10^6 \\times 10^6$ system of equations?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.121252792, 2000)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t[end], n[end] # the last measured time and n for LU factorization" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.5156599e7" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "secs = t[end] * (1e6/n[end])^3 # this many seconds" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25 weeks, 10 hours, 9 minutes, 59 seconds" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# convert to a human time period\n", "using Dates\n", "Dates.canonicalize(Dates.CompoundPeriod(Dates.Second(round(Int,secs))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, we **usually run out of memory before we run out of time:**" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8000.0 GB for a 10⁶×10⁶ matrix\n" ] } ], "source": [ "println((1e6)^2 * sizeof(Float64) / 10^9, \" GB for a 10⁶×10⁶ matrix\")" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "In practice, people do *regularly* solve problems this large, and even larger, but they can do so because real matrices that big almost always have some **special structure** that allows you to solve them more quickly and store them more compactly. For example, a common special structure is [sparsity](https://en.wikipedia.org/wiki/Sparse_matrix): matrices whose entries are *mostly zero*. We will learn some basic ways to take advantage of this later in 18.06, and sparse-matrix methods are covered more extensively in 18.335." ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.8.0", "language": "julia", "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.8.1" } }, "nbformat": 4, "nbformat_minor": 2 }