2012-02-19 14 views
9

zastanawiam co napowietrznej wykonywania połączenia jądra CUDA jest w C/C++, takie jak:Wydajność kara podczas wywoływania jądra cuda

somekernel1<<<blocks,threads>>>(args); 
somekernel2<<<blocks,threads>>>(args); 
somekernel3<<<blocks,threads>>>(args); 

Powodem Pytam to dlatego, że Aplikacja, którą buduję obecnie sprawia, że ​​powtarzające się połączenia w kilka jądra (bez pamięci są ponownie odczytywane/zapisywane na urządzeniu między połączeniami) i zastanawiam się, czy zawijanie tych połączeń jądra w jedno wywołanie jądra (z somekernel1-3 stają się funkcje urządzenia) spowodowałoby jakąkolwiek istotną różnicę w wydajności.

Odpowiedz

13

Uruchamianie jądra po stronie hosta przy użyciu interfejsu API środowiska wykonawczego wynosi tylko około 15-30 mikrosekund na platformach innych niż WDDM dla systemu Windows. Na platformach WDDM (których nie używam) rozumiem, że może być znacznie, dużo więcej, a ponadto w sterowniku jest jakiś mechanizm dozujący, który próbuje amortyzować koszty, wykonując wiele operacji w jednej operacji po stronie kierowcy.

Zasadniczo nastąpi wzrost wydajności "łączenia" operacji związanych z wieloma danymi, które w innym przypadku byłyby wykonywane w oddzielnych jądrach w jednym jądrze, na które pozwalają algorytmy. GPU ma znacznie wyższą arytmetyczną wydajność szczytową niż przepustowość pamięci szczytowej, więc im więcej FLOPów, które mogą być wykonywane na transakcję pamięci (i na "kodzie konfiguracji" jądra), tym lepsza będzie wydajność jądra. Z drugiej strony, próba napisania jądra "szwajcarskiego scyzoryka", który stara się całkowicie rozproszyć różne operacje w jednym kawałku kodu, nigdy nie jest szczególnie dobrym pomysłem, ponieważ zwiększa nacisk rejestru i zmniejsza wydajność takich rzeczy jak L1, stałe pamięci i pamięci podręczne tekstur.

Którą drogą wybierzesz, należy kierować się naturą kodu/algorytmów. Nie wierzę, że istnieje jedna "poprawna" odpowiedź na to pytanie, którą można zastosować we wszystkich okolicznościach.

+0

Podejście szwajcarskiego noża wojskowego jest czymś, czego staram się uniknąć, aby utrzymać dzielenie się tymi kernelami pomiędzy projektami. Dzięki za odpowiedź, chciałem tylko upewnić się, że nie było jakiegoś szalonego problemu z wydajnością, którego nie byłem świadomy podczas wykonywania wielu połączeń cuda. – NothingMore

+1

Uwaga: w WDDM, jeśli używasz procesora graficznego Tesla, możesz użyć sterownika Tesla Compute Cluster (TCC), aby dostosować wydajność do platform innych niż WDDM, takich jak XP lub Linux. Na oryginalne pytanie chciałbym podkreślić: jeśli połączenie jądra pomaga zmniejszyć wymagane transfery PCI-express, może być tego warte. Jeśli nie, to przynajmniej upewnij się, że nakładasz się na Kernel1 z transferami do GPU danych dla Kernel2, itp. – harrism

+0

Czy mówisz o platformach Windows innych niż WDDM? winXP? Jestem bardzo zainteresowany, ponieważ kara WDDM jest OGROMNA, a ja nie mogę podrosnąć do Linuksa. Z powodzeniem używam Win7 x64 i potrzebuję platformy x64 (problemy z RAM) – Dredok

1

Jeśli używasz programu Visual Studio Pro w systemie Windows, sugeruję uruchomienie aplikacji testowej przy użyciu programu Parallel NSight firmy NVidia, myślę, że może on odczytać znaczniki czasu z wywołania metody do rzeczywistej realizacji, w każdym przypadku kara jest nieodłączna , ale będzie to nieistotne, jeśli twoje jądra będą trwały długo.

+0

Nie używam okien (RHEL 6.0, Tesla C2075). – NothingMore

Powiązane problemy