Python, numpy и кэшлайнPython

Программы на Python
Ответить
Anonymous
 Python, numpy и кэшлайн

Сообщение Anonymous »

Я пытаюсь следовать https://igoro.com/archive/gallery-of-pr ... e-effects/ в Python, используя numpy.
Хотя это не работает, и я не работаю вполне понимаю почему... имеет dtypes фиксированного размера, например np.int64, который занимает 8 байт.
Таким образом, при длине строки кэша в 64 байта в кеше должно храниться 8 значений массива.Таким образом, при определении времени я не должен увидеть заметного изменения требуемого времени при доступе к значениям в строке кэша, поскольку требуется такое же количество передач строк кэша.
Основываясь на этом SO-ответе, я также попытался отключить сборку мусора, но это ничего не изменило.

Код: Выделить всё

# import gc
import time
import numpy as np

def update_kth_entries(arr, k):
arr[k] = 0
start = time.perf_counter_ns()
for idx in range(0, len(arr), k):
arr[idx] = 0
end = time.perf_counter_ns()
print(f"Updated every {k:4} th entry ({len(arr)//k:7} elements) in {(end - start)*1e-9:.5f}s")
return arr

# gc.disable()
arr = np.arange(8*1024*1024, dtype=np.int64)
print(
f"(Data) size of array: {arr.nbytes/1024/1024:.2f} MiB "
f"(based on {arr.dtype})"
)

for k in np.power(2, np.arange(0,11)):
update_kth_entries(arr, k)
# gc.enable()
Это дает что-то вроде

Код: Выделить всё

(Data) size of array: 64.00 MiB (based on int64)
Updated every    1 th entry (8388608 elements) in 0.72061s
Updated every    2 th entry (4194304 elements) in 0.32783s
Updated every    4 th entry (2097152 elements) in 0.14810s
Updated every    8 th entry (1048576 elements) in 0.07622s
Updated every   16 th entry ( 524288 elements) in 0.04409s
Updated every   32 th entry ( 262144 elements) in 0.01891s
Updated every   64 th entry ( 131072 elements) in 0.00930s
Updated every  128 th entry (  65536 elements) in 0.00434s
Updated every  256 th entry (  32768 elements) in 0.00234s
Updated every  512 th entry (  16384 elements) in 0.00129s
Updated every 1024 th entry (   8192 elements) in 0.00057s
Вот выходные данные lscpu -C

Код: Выделить всё

NAME ONE-SIZE ALL-SIZE WAYS TYPE        LEVEL  SETS PHY-LINE COHERENCY-SIZE
L1d       32K     384K    8 Data            1    64        1             64
L1i       32K     384K    8 Instruction     1    64        1             64
L2       256K       3M    4 Unified         2  1024        1             64
L3        16M      16M   16 Unified         3 16384        1             64
На данный момент я совершенно не понимаю того, что наблюдаю.
  • С одной стороны, я не вижу кэш, используя приведенный выше код.
  • С другой стороны, я могу продемонстрировать некоторый эффект кэширования ЦП, используя что-то вроде этого ответа, с достаточно большим 2D-массивом.
    Вышеуказанные тесты я проводил в контейнере на Mac.
    Быстрый тест на моем Mac показывает такое же поведение.
    Это такое странное поведение из-за интерпретатора Python?
    Что мне здесь не хватает?

    Подробнее здесь: https://stackoverflow.com/questions/790 ... -cacheline
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»