2015-04-20 13 views
27

Ho un set di n vettori memorizzati nella matrice 3 x nz. Trovo il prodotto esterno usando np.einsum. Quando ho cronometrato utilizzando:Che cosa significa "un risultato intermedio viene memorizzato nella cache"?

%timeit v=np.einsum('i...,j...->ij...',z,z) 

ho ottenuto il risultato:

The slowest run took 7.23 times longer than the fastest. This could mean that an 
intermediate result is being cached 
100000 loops, best of 3: 2.9 µs per loop 

Quello che sta accadendo qui e può essere evitato? Il miglior 3 è 2,9us, ma il più lento forse più tipico.

+4

Per scopi di test, provare ad aumentare la dimensione 'n', questo ridurrà la frazione di' z' che è memorizzata nella cache della CPU e il messaggio dovrebbe scomparire ad un certo punto –

risposta

24

Il messaggio "risultato intermedio viene memorizzato nella cache" è solo un'ipotesi cieca nel messaggio fisso riportato da% timeit. Potrebbe essere o non essere vero, e non dovresti dare per scontato che sia corretto.

In particolare, uno dei motivi più comuni per cui la prima esecuzione è più lenta è che l'array si trova nello CPU cache solo dopo la prima esecuzione.

Le CPU memorizzano automaticamente le cose; non puoi evitarlo, e non vuoi davvero evitarlo. Tuttavia, l'ottimizzazione degli algoritmi in modo che le cache della CPU possano funzionare in modo ottimale è al giorno d'oggi uno dei colli di bottiglia che l'elaborazione ad alte prestazioni deve tenere in considerazione.