2013-04-04 11 views
6

Jestem nowy w High Performance Computing i moje pierwsze pytanie na tym forum, na którym długo byłem czytnikiem.Działanie arytmetyczne na bardzo dużych macierzach statycznych w C/C++

Zasadniczo muszę zrobić operacji arytmetycznych na bardzo dużych tablic jak na przykład

double variable [9][4][300][300][300] (uninitialized) 

case 1: Gdybym zadeklarować tablicę powyżej jako local/automatic następnie otrzymuję błąd czasu gdybym skompilowany bez optymalizacja jakg++ file.cpp” .. (błąd jest segmentacja winy - przepełnienie stosu ???)

przypadek 2: W tej samej sprawie jak wyżej, gdybym miał Compi le z optymalizacją kodu działa zgodnie z oczekiwaniami. "g++ -O2 file.cp p”(jest array w bss teraz ???)

przypadek 3: Jeśli zrobię zmienna global/static następnie kompiluje w porządku, ale mimo to nie działa i po prostu daje komunikat«killed»na terminalu i kończy.

nie ma prawdziwy problem, ale jestem ciekawy i chcesz dowiedzieć się, co się dzieje, gdy wyjątkowo duże tablice zostały zgłoszone i skąd one znajdować się w pamięci w zależności od ich typu danych.

Zdaję sobie również sprawę z metoda generowania tych tablic w czasie wykonywania za pomocą malloc lub Nowy. Wtedy oczywiście będzie na kupie.

Więc najważniejsze pytanie dla mnie jest -> co jest najskuteczniejszą metodą (tj najmniejszy run-time podczas obliczania tablic w pamięci) radzenia sobie z dużymi tablicami przy kompilacji z g++ i działa na linux clusters.

Dziękuję za cierpliwość w czytaniu.

+1

Ta tablica jest czystym szaleństwem. Musisz użyć bardziej inteligentnego rozwiązania do przetwarzania tej ilości danych, chyba że twoja platforma docelowa jest jakąś bestialską maszyną. Ponieważ wydaje się, że tak nie jest, przesyłaj dane z dysku w porcjach lub coś podobnego. –

+0

Te tablice są nieuniknione. Reprezentują zmienne w 4-wymiarowej przestrzeni. A operacje pamięciowe rozwiązują złożone nieliniowe równanie różniczkowe. I w końcu kod będzie działał na klastrze złożonym z 50 węzłów z więcej niż 100 GB pamięci. Dane są rzeczywiście odczytywane z dysku.Moja ciekawość polega na zrozumieniu, gdzie znajdują się te dane w czasie wykonywania, a która sekcja (bss/stack/heap) zapewnia najszybszą wydajność w czasie wykonywania. – physicist

+1

Naprawdę chciałbym zaproponować ci wykonanie swojej pracy w oparciu o biblioteki matematyczne, takie jak Armadillo lub BLAS. WSZYSTKIE RZECZ, co robisz, i mam na myśli DOWOLNĄ RZECZ, niemożliwą do pokonania wydajność tych bibliotek. Rozważ użycie ich od samego początku :) – amas

Odpowiedz

7

Zmienne lokalne będą zawsze na stosie, niezależnie od optymalizacji flagi. A ta tablica będzie miała około 7 gigabajtów! O wiele większy niż jakikolwiek możliwy stos.

Wielkość może być również przyczyną tego, że nie rozpocznie się, jak gdyby umieścić go jako zmienną globalną/statyczne to trzeba mieć więcej niż 7 GB lub pamięć wirtualną darmo i przyległe aby móc nawet załadować program.

+0

Tak więc dla przypadku 2 (z pytania) tablica jest nadal w stosie. Myślałem, że stos ma limit rozmiaru 8kb? Czy dobrze cię rozumiem? Nie dałem żadnej opcji kompilacji, aby zwiększyć limit stosu. – physicist

+2

Dopóki zmienna nie zostanie zoptymalizowana, nie jest nigdzie. –

+1

@physicist Stos na większości nowoczesnych systemów mieści się w zakresie od jednego do czterech megabajtów. Mogą istnieć flagi, które możesz przekazać linkerowi, aby dany system mógł go zmienić, ale wtedy stos będzie miał taki rozmiar dla całego programu i przez większość czasu tylko ułamek (prawdopodobnie mniej niż pół procenta z tego 7 GB) będzie używany. Ogromne marnowanie pamięci. Istnieją lepsze sposoby radzenia sobie z dużymi zbiorami danych na normalnym komputerze domowym, na przykład mapowanie pamięci pliku. –

3

Mogę zaproponować coś wzdłuż linii:

typedef double slice[300][300][300]; 

std::vector<slice> variable[9] = { 4, 4, 4, 4, 4, 4, 4, 4, 4 }; 

ten sposób każdy wektor z 4 slice obiektów będą dynamicznie przydzielane zawartość 9 wektory nie muszą sąsiadować ze sobą, a stos zużycie wystarcza tylko dla metadanych dla 9 wektorów.

+0

, co jest interesującym podejściem. pozwól mi spróbować i zobaczyć. Dziękuję Ci. – physicist

Powiązane problemy