Эта деталь причины очень сложна. Вы знаете, что когда ПК запускает X @ b
, он выполняет много других необходимых инструкций, возможно, load data from RAM to cache
и так далее. Другими словами, время затрат состоит из двух частей - «реальные инструкции вычисления» в ЦП, представленные Cost_A
, и «другие обязательные инструкции», представленные Cost_B
. У меня есть идея, только мое предположение, что это Cost_B
ведет к time_k << k x time_1
.
Поскольку форма b мала (например, 1000 x 1), «другие необходимые инструкции» стоят относительно больше времени. Поскольку форма b огромна (например, 1000 x 10000), она относительно мала. Следующая группа экспериментов может дать менее строгое доказательство. Мы можем видеть, что когда форма b увеличивается от (1000 x 1) до (1000 x), время затрат увеличивается очень медленно.
import numpy as np
import time
X = np.random.random((1000, 1000))
b = np.random.random((1000, 1))
b3 = np.random.random((1000, 3))
b5 = np.random.random((1000, 5))
b7 = np.random.random((1000, 7))
b9 = np.random.random((1000, 9))
b10 = np.random.random((1000, 10))
b30 = np.random.random((1000, 30))
b60 = np.random.random((1000, 60))
b100 = np.random.random((1000, 100))
b1000 = np.random.random((1000, 1000))
def test_cost(X, b):
begin = time.time()
for i in range(100):
_ = X @ b
end = time.time()
print((end-begin)/100.)
test_cost(X, b)
test_cost(X, b3)
test_cost(X, b5)
test_cost(X, b7)
test_cost(X, b9)
test_cost(X, b10)
test_cost(X, b30)
test_cost(X, b60)
test_cost(X, b100)
test_cost(X, b1000)
output:
0.0003210139274597168
0.00040063619613647463
0.0002452659606933594
0.00026523590087890625
0.0002449488639831543
0.00024344682693481446
0.00040068864822387693
0.000691361427307129
0.0011700797080993653
0.009680757522583008
Более подробно я провожу серию экспериментов с pref
в linux. Для pref
, Cost_B
может быть более большим. У меня есть 8 файлов Python, первый из которых выглядит следующим образом.
import numpy as np
import time
def broken2():
mtx = np.random.random((1, 1000))
c = None
c = mtx ** 2
broken2()
Я обработал вывод в таблицу A следующим образом.
Я делаю простой анализ, который делю ошибку числа операций (лайков, пропусков кэша) в соседних экспериментах на ошибку time elapsed(seconds)
. Затем я получаю следующую таблицу B. Из таблицы мы можем найти, что по мере увеличения формы b линейная зависимость между формой и временем затрат становится более очевидной. И, может быть, главная причина, по которой time_k << k x time_1
- это cache misses
(загрузка данных из ОЗУ в кэш), для него сначала стабилизируется .