Pobieranie danych z wyprzedzeniem (_mm_prefetch)

0

Witam,
gdyby ktoś mógł mi wytłumaczyć działanie funkcji _mm_prefetch
Jeśli dobrze rozumiem, to funkcja ta pobiera całą cache-line danych do pamięci podręcznej?
czyli jeśli napiszę _mm_prefetch((const char*)(&A[i]), _MM_HINT_T0);
gdzie A - tablica double, a cahce-line ma 32B,
to do cache-linii załaduje mi el: A[i], A[i+1], A[i+2], A[i+3]?

Na http://www.csie.ntu.edu.tw/~cyy/courses/assembly/07fall/lectures/handouts/lec15_simd_4up.pdf
slajdy 80-81 znalazłem przykład, gdzie występuje kilka instrukcji prefetch pod rząd. Czy to nie spowoduje nadpisania pamięci cache (w rezultacie w pamięci będzie wynik tej ostatniej instrukcji prefetch)? Czy źle rozumiem ten mechanizm? Czy może po prostu tych cache-linii jest więcej? ;)

__m128 x1 = _mm_load_ps(vec1_x);
__m128 y1 = _mm_load_ps(vec1_y);
__m128 z1 = _mm_load_ps(vec1_z);
__m128 x2 = _mm_load_ps(vec2_x);
__m128 y2 = _mm_load_ps(vec2_y);
__m128 z2 = _mm_load_ps(vec2_z);
_mm_prefetch((const char*)(vec1_x + next),_MM_HINT_NTA);
_mm_prefetch((const char*)(vec1_y + next),_MM_HINT_NTA);
_mm_prefetch((const char*)(vec1_z + next),_MM_HINT_NTA);
_mm_prefetch((const char*)(vec2_x + next),_MM_HINT_NTA);
_mm_prefetch((const char*)(vec2_y + next),_MM_HINT_NTA);
_mm_prefetch((const char*)(vec2_z + next),_MM_HINT_NTA);
__m128 t1 = _mm_mul_ps(x1, x2);
__m128 t2 = _mm_mul_ps(y1, y2);
t1 = _mm_add_ps(t1, t2);
t2 = _mm_mul_ps(z1, z2);
t1 = _mm_add_ps(t1, t2);
_mm_stream_ps(output, t1);
0

Czy może po prostu tych cache-linii jest więcej?
Tak, linii cache jest rozmiar_cache/rozmiar_linii. Kilka instrukcji prefetch ładuje dane do kilku różnych linii.
(oczywiście w dużym uproszczeniu)

1 użytkowników online, w tym zalogowanych: 0, gości: 1