Questo probabilmente ha a che fare con conflitti nella cache L2.
La cache mancante su matice1 non è il problema perché si accede in sequenza. Tuttavia per matice2 se una colonna intera si inserisce in L2 (cioè quando si accede a matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... ecc., Nulla viene sfrattato) di quanto non vi siano problemi con cache manca anche con matice2.
Ora per approfondire il funzionamento delle cache, se l'indirizzo byte della variabile è X, la riga della cache per essa sarebbe (X >> 6) e (L - 1). Dove L è il numero totale di righe della cache nella cache. L è sempre la potenza di 2. Il sei deriva dal fatto che 2 ^ 6 == 64 byte è la dimensione standard della riga della cache.
Cosa significa questo? Bene significa che se ho l'indirizzo X e l'indirizzo Y e (X >> 6) - (Y >> 6) è divisibile per L (cioè una grande potenza di 2), saranno memorizzati nella stessa cache.
Ora per tornare al tuo problema qual è la differenza tra il 2048 e il 2049,
quando 2048 è la tua taglia:
se prendi & matice2 [x, k] e & matice2 [y, k] la differenza (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) sarà divisibile per 2048 * 4 (dimensione di galleggiante). Quindi una grande potenza di 2.
Pertanto, a seconda delle dimensioni del tuo L2, avrai molti conflitti di linea nella cache e utilizzerai solo una piccola parte del tuo L2 per memorizzare una colonna, quindi non sarai in grado di archiviare l'intera colonna nella tua cache, quindi otterrai prestazioni scadenti .
Quando la dimensione è 2049, la differenza è 2049 * 4 che non è la potenza di 2, quindi avrai meno conflitti e la tua colonna si adatterà tranquillamente alla tua cache.
Ora per testare questa teoria ci sono un paio di cose che puoi fare:
Alloca il tuo array matice2 come questo matice2 [razmor, 4096], ed esegui con razmor = 1024, 1025 o qualsiasi dimensione, e dovresti vedere prestazioni pessime rispetto a quanto avevi prima. Questo perché allinei con forza tutte le colonne in conflitto tra loro.
Quindi prova matice2 [razmor, 4097] ed eseguilo con qualsiasi dimensione e dovresti vedere prestazioni molto migliori.