Jak utworzyc dynamicznie dwywumiarowa tablice w jednym bloku pamieci?

0

Witam. Pisze program z wykorzystaniem CUDY i natrafilem na pewien problem. Otoz w czesci wykonywanej na CPU mam pare tablic dwuwymiarowych tworzonych dynamicznie (czyli tablica wskaznikow i kazdy wskaznik wskazuje na tablice tworzona za pomoca new). Aby przeslac dane do GPU mam 2 wyjscia: albo przesylac je tak, jak tworze tablice, czyli po kolei wszystkie "wiersze", albo wyslac jeden obszar pamieci. Pierwsze wyjscie jest kiepskie z powodu duzego rozdrobnienia, a co za tym idzie dlugiego czasu zmarnowanego na oczekiwanie na dostepnosc magistrali. Drugie wyjscie natomiast zmusza mnie do tworzenia dodatkowego bloku pamieci, gdzie zbiore porozrzucane dane z wczesniej w tablicach dwuwymiarowych (bo przy uzyciu operatora new nie wiem, w ktorym miejscu pamieci miejsce zostanie zarezerwowane i malo prawdopodobne, zeby new rezerwowalo sasiednie obszary) i umieszcze je w jednym ciaglym obszarze.

Teraz pytanie: czy da sie jakos wymusic, zeby operator new rezerwowal miejsce w wybranym przez nas miejscu? Ewentualnie czy da sie jakos utworzyc dynamicznie dwuwymiarowa tablice w jednym ciagu pamieci tak, by mozna sie bylo pozniej odnosic do niej za pomoca [][] (wiem, ze mozna zarezerwowac duzy obszar na tablice jednowymiarowa, ale wtedy nie mozna [][] uzywac)? Jesli zadna z tych rzeczy nie jest mozliwa, to czy ma ktos jakas rade, jak najlepiej byloby to przeslac do grafiki?

Z gory dzieki za wsystkie odpowiedzi, pozdrawiam.

Zapomnialem dodac - uzywam Visual Studio (czyli msvc), ale pisze w czystym c++.

0

zrób normalną tablicę (blok ciągły) i przeliczaj współrzędne: x,y => y * width + x
nie ma co kombinować...

0
jerzykiler napisał(a)

Teraz pytanie: czy da sie jakos wymusic, zeby operator new rezerwowal miejsce w wybranym przez nas miejscu?

Można, ale to miejsce musi należeć do Ciebie.

int *miejsce = new int[20]; // Rezerwacja

int *obiekt = new (miejsce) int;
0

Tak również może być:

int *miejsce = new int[20]; // Rezerwacja

int *obiekt = new reinterpret_cast(void*)<&miejsce> int;
0

Niszczysz oczywiście tak:

delete [] miejsce;

Sorki za post pod postem. Mam nadzieję, że pomogłem. :)

0

Znalazłem :p
http://www.ifj.edu.pl/~grebosz/przyklady_symfonia_c++_std_wyd_1.zip

plik
08_11_4_str302_placement_new.cpp

1 użytkowników online, w tym zalogowanych: 0, gości: 1