Cuda i metody numeryczne z domniemaną dyskretyzacją czasu

10

Chcę zaimportować kod, który rozwiązuje zbiór równań różniczkowych cząstkowych (PDE) metodą objętości skończonej w formie IMPLICIT (dla dyskretyzacji czasu).

W wyniku tego powstaje tridiagonalny układ równań w kierunkach x, y, z, który jest obsługiwany przez schemat ADI / TDMA.

Nie mogę znaleźć niczego, co dotyczy niejawnego rozwiązania PDE z CUDA.

Czy możliwe jest wdrożenie schematu ADI / TDMA w CUDA? Czy jest gdzieś dostępny przykład 2D równania dyfuzji ciepła?

Jedyne, co mogłem znaleźć, to przykładowy kod CUDA dla równania 2D dyfuzji ciepła w różnicach skończonych, ale w formie EXPLICIT (University of Cambridge).

Wszelkie wskazówki / odniesienia byłyby bardzo mile widziane.

Khine
źródło
2
Z jakim typem PDE pracujesz? Czy to jest liniowe, nieliniowe? Czy cały system jest trójosiowy? (Nie rozumiem, co miałeś na myśli przez „tridiagonal w kierunkach x, y, z”). Zasadniczo trudno jest zaimplementować rzadkie solwery lub iteracyjne solwery na GPU ze względu na zglobalizowane produkty wewnętrzne i nieregularną komunikację (ale komunikacja może być mniejszym problemem, jeśli jest to tridiagonal). Edycja: Ok googled ADI, nigdy wcześniej go nie używałem. Szybkie google na trójdrożnych rozwiązaniach znalazło to: impact.crhc.illinois.edu/shared/papers/sc12_tridiagonal-1.pdf
Reid.Atcheson
Dziękuję za link. Wartości PDE pochodzą z równań zachowania pędu, masy i energii, więc są silnie sprzężone i nieliniowe. Wydaje się, że pan Mikołaj Sacharnykh już to zrobił. Oto link dla zainteresowanych: nvidia.com/content/GTC/documents/1058_GTC09.pdf . Nie mogę jednak znaleźć przykładowego kodu, który naprawdę by pomógł.
Khine
2
Usuń duplikat postu na stronie SO lub poproś o migrację tutaj.
David Ketcheson

Odpowiedzi:

1

Ten problem nadaje się do postaci wysoce wektorowej. Jak zauważyłeś, metoda ADI daje kilka kroków układów trójosiowych. Ponieważ ma on postać równań liniowych, możesz używać CUsolver i CUblas do wywoływania równoległych wersji GPU standardowych procedur algebry liniowej. Korzystając z nich, powinieneś być w stanie pobrać jawny kod i po prostu zmienić wewnętrzną pętlę na odpowiednie wywołanie CUsolver i rozwiązać go w taki sposób, aby kod wyglądał prawie dokładnie jak implementacja procesora, ale z operacjami macierzowymi wykonywanymi na GPU przez połączenia z biblioteką.

Chris Rackauckas
źródło