Jak to jest z tym dual channelem - kiedy to działa a kiedy nie?
Zauważyłem że niektóre programy testowe podwajają szybkość pamięci a inne prawie wcale (może trochę, tak do 5%).
Zatem to musi być zależeć od algorytmu, może opcji kompilacji, czyli instrukcji lub sposobu kodowania niektórych operacji.
Kopiowanie pamięci można wykonać na kilka sposobów:
- tradycyjne mov, zwykle z rep.
- z rozwinięciem, tz. używamy kilka rejestrów a nie tylko dwa:
prosta wersja:
void copy(dst, src, n)
{
while( --n >= 0 ) *dst++ = *src++;
}
teraz z rozwinięciem:
void copy(dst, src, n2)
{
s1 = src+1; d1 = dst+1;
while( --n2 >= 0 )
{
*dst = *src; dst+=2; src+=2;
*d1 = *s1; d1+=2; s1+=2;
}
}
To powinno zasuwać równolegle (można bardziej rozwinąć, np. x 4)
- to samo ale za pomocą instrukcji SSE
Być może o to tu chodzi?
Zwykle nie rozwijamy kodu w taki sposób, więc to w ogóle nie używa możliwości dual channel i stąd marne przyspieszania w tradycyjnych benchmarkach (one chyba testują jedynie szybkości pojedynczego kanału, a nie przepustowość pamięci w ogóle).
n
jest nieparzyste, kod się wysypie.[n]
jest prawidłowym (choć niechcianym) indeksem, to kod zadziała, ale źle)