2011-05-16 22 views
11

Mam wektor kolumnowy A, który ma 10 elementów. Mam macierz B, która wynosi 10 na 10. Pamięć dla B jest kolumną główną. Chciałbym, aby zastąpić pierwsze wiersz w B z kolumna wektora A.Czy istnieje standardowa, skrócona wersja memcpy?

Oczywiście, mogę zrobić:

for (int i=0; i < 10; i++) 
{ 
    B[0 + 10 * i] = A[i]; 
} 

gdzie zostawiłem zero w 0 + 10 * i podkreślić, że korzysta z kolumny B -główne przechowywanie (zero to indeks wiersza).

Po kilku przesłuchaniach na dzisiejszej ziemi CUDA, pomyślałem, że może istnieć funkcja procesora do wykonania skomplikowanego memcpy ?? Wydaje mi się, że na niskim poziomie wydajność zależałaby od istnienia instrukcji z obciążeniem/przechowywaniem, której nie pamiętam w zestawie x86.

+0

Może powinieneś rozważyć zmianę strategii przechowywania dla tej macierzy lub zapisać jej transpozycję. –

Odpowiedz

8

Krótka odpowiedź: napisany przez Ciebie kod jest tak szybki, jak to tylko możliwe.

Długa odpowiedź: Funkcja memcpy jest napisana przy użyciu skomplikowanych elementów wewnętrznych lub złożenia, ponieważ działa na operandach pamięciowych, które mają dowolny rozmiar i wyrównanie. Jeśli nadpisujesz kolumnę macierzy, twoje operandy będą miały naturalne wyrównanie i nie będziesz musiał uciekać się do tych samych sztuczek, aby uzyskać przyzwoitą prędkość.

+0

Sądzę, że po prostu miałem nadzieję na dostęp na poziomie zespołu, aby powiedzieć "niezłomowane ładowanie/instrukcje przechowywania dla podwójnej i potrójnej pamięci kanału. –

+0

Nie jestem pewien, co masz na myśli przez operacje "załaduj/załaduj" bez obciążenia. –

+0

Być może to po prostu błędne postrzeganie z mojej strony, ale myślałem, że potrójnie kanałowy ram został rozłożony przez przestrzeń adresową? Gdybym mógł napisać do jednego z układów pamięci (napisać tylko w jednym kanale z mniejszą prędkością), który byłby odpowiednikiem strided memcpy? To oczywiście zależy w dużym stopniu od ziarnistości pasków. –