2008-11-27 9 views
22

W jakich okolicznościach należy się spodziewać, że memcpys przewyższy liczbę zadań na nowoczesnym sprzęcie INTEL/AMD? Korzystam z GCC 4.2.x na 32-bitowej platformie Intela (ale interesuje mnie również wersja 64-bitowa).memcpy vs cesja w C

+0

Interesujące pytanie! Ponieważ jesteś wyraźnie zaniepokojony, jak poprawić szybkość operacji pamięciowych: Ostatnio czytałem o roli kompresji w przenoszeniu pamięci od kogoś, kto opracował pyTables: http://www.pytables.org/docs/StarvingCPUs.pdf Jak już wspomniano, zwykłe użycie memcpy może być powolne w porównaniu do jego ulepszeń z bardzo szybkimi kompresorami ([blosc] (http://blosc.pytables.org/trac/)). Należy to uwzględnić tylko w przypadku produktów o wysokiej wydajności! – math

+0

To pytanie jest dość szerokie. –

Odpowiedz

33

Nigdy nie należy oczekiwać, że będą lepsze od przydziałów. Powodem jest to, że kompilator i tak będzie używał memcpy, gdy myśli, że byłoby to szybsze (jeśli użyjesz flag optymalizujących). Jeśli nie, a struktura jest rozsądnie mała, że ​​pasuje do rejestrów, można zastosować bezpośrednią manipulację rejestrami, która w ogóle nie wymagałaby dostępu do pamięci.

GCC ma wewnętrznie wewnętrzne wzorce blokowe, które wymyślają, kiedy bezpośrednio zmieniać rejestry/komórki pamięci lub kiedy używać funkcji memcpy. Uwaga przy przypisywaniu struktury, kompilator wie, w czasie kompilacji, jak duży ruch będzie, więc może rozwinąć małe kopie (wykonaj ruch n-razy w wierszu zamiast pętli) na przykład. Uwaga -mno-memcpy:

-mmemcpy 
-mno-memcpy 
    Force (do not force) the use of "memcpy()" for non-trivial block moves. 
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies. 

Kto wie lepiej, gdy w użyciu memcpy niż sam kompilator?

+4

Należy pamiętać, że można zastosować odwrotną stronę - przynajmniej w GCC, memcpy o małym stałym rozmiarze są zastępowane instrukcjami kopiowania, a jeśli używane ze wskaźnikiem do małego źródła i/lub miejsca docelowego nie * nie * uniemożliwiają jedno lub oba zoptymalizowane do rejestry. A więc: rób wszystko, co wynika z najprostszego kodu. –

+2

Nie należy oczekiwać, że jeden będzie lepszy od drugiego. Jeśli masz problem z wydajnością, powinieneś go profilować, sprawdzić, czy przypisanie/memcpy to problem, a jeśli tak, spróbuj zmienić je, aby użyć drugiego, i sprawdź, czy to działa lepiej. Więcej profilowania, mniej zgadywania. ;) – jalf

+1

Oznacza to, że spodziewam się, że "zadania będą lepsze od memcpy" także będzie fałszywe, biorąc pod uwagę, że ankietowany określił ostatnio GCC. Ale zakładając, że nie jest wymagana obsada, zgadzam się z twoją radą na wykorzystanie zadania, ponieważ daje to najwyraźniejszy kod. –