在演算法課程中,我們往往使用時間複雜度(大 o 符號)作為衡量演算法效能的重要指標。這種表示方法對於演算法理論效能分析非常有效,但也可能給我們帶來一種誤解,即常數項的時間複雜度變化對實際的數值計算效率影響不大。事實上,在實際的數值計算中,有以下關於計算效能的重要事實。儘管它們帶來的都是常數級的時間複雜度變化,但對計算效能的影響卻相當顯著。
以下示例程式使用了 python 的三重 for 迴圈、cython 的三重 for 迴圈、numpy 的 dot 函式和 tensorflow 的 matmul 函式,分別計算了兩個 10000×10000 的隨機矩陣 a 和 b 的乘積。程式執行平台為一台具備 intel i9-9900k 處理器、nvidia geforce rtx 2060 super 顯示卡與 64gb 記憶體的個人電腦(後文亦同)。執行所需時間分別標註在了程式的注釋中。
import tensorflow as tf
import numpy as np
import time
import pyximport; pyximport.install()
import matrix_cython
a = np.random.uniform(size=(10000, 10000))
b = np.random.uniform(size=(10000, 10000))
start_time = time.time()
c = np.zeros(shape=(10000, 10000))
for i in range(10000):
for j in range(10000):
for k in range(10000):
c[i, j] += a[i, k] * b[k, j]
print('time consumed by python for loop:', time.time() - start_time) # ~700000s
start_time = time.time()
c = matrix_cython.matmul(a, b) # cython **為上述 python **的 c 語言版本,此處省略
print('time consumed by cython for loop:', time.time() - start_time) # ~8400s
start_time = time.time()
c = np.dot(a, b)
print('time consumed by np.dot:', time.time() - start_time) # 5.61s
a = tf.constant(a)
b = tf.constant(b)
start_time = time.time()
c = tf.matmul(a, b)
print('time consumed by tf.matmul:', time.time() - start_time) # 0.77s
可見,同樣是 o(n^3) 時間複雜度的矩陣乘法(具體而言10^2次浮點數乘法的計算量),使用 gpu 加速的 tensorflow 竟然比直接使用原生 python 迴圈快了近 100 萬倍!這種極大幅度的優化**於兩個方面,一是使用更為高效的底層計算操作,避免了原生 python 語言直譯器的各種冗餘檢查等所帶來的效能損失(例如,python 中每從陣列中取一次數都需要檢查一次是否下標越界)。二是利用了矩陣相乘運算具有的充分的可並行性。在矩陣相乘 a * b 的計算中,矩陣 a 的每一行與矩陣 b 的每一列所進行的相乘操作都是可以同時進行的,而沒有任何的依賴關係。 關於量子計算,你應該知道的七個事實
在很多人眼中,量子計算機被認為能夠完成經典計算機所不能完成的任務。事實上,如果量子計算機缺乏足夠數量的處理單元,即量子位元,以及足夠的穩定性來做有用的工作,這些好處就仍然只是理論上的。目前,全球少數國家和地區,包括美國 中國 歐盟與日本,以國防 軍工 科研部門為代表的力量都在量子計算領域發力,並帶動...
關於計算機效能的術語
1.2.響應性 不同於處理請求,它是系統響應請求的速度有多快。這個指標在許多系統裡非常重要,因為對於一些系統而言,如果其響應性太慢,使用者將難以忍受 儘管其響應時間可能不慢。如果在請求處理期間,系統一直處於等待狀態,則系統的響應性和響應時間是相同的。然而,如果能夠在處理直正完成之前就給使用者一些資訊...
關於高效能計算的知識記錄彙總 菜鳥級別
菜鳥級別 mpi和openmpi的區別,或者cuda和opencl的區別,這篇文章就是為了總結下高效能計算的相關知識。目前高效能計算有兩大趨勢,平行計算集群和cpu處理器和gpu顯示卡的異構混合計算。下面做對這些名詞進行乙個簡單的介紹 mpi message passing inte ce 是乙個平...