2013-08-29 11 views
8

Zauważyłem, że często, global i constant pamięć urządzenia jest inicjowany na 0. Jest to uniwersalna zasada? Nie udało mi się znaleźć niczego w standard.Czy OpenCL zawsze zeruje inicjowanie pamięci urządzenia?

+0

To chyba inicjowany do zera na komputerze PC, ponieważ często zawierają informacjami poufnymi. Na konsoli prawdopodobnie nie byłoby takiej troski. – Potatoswatter

+0

Symulator mojego nosa eksplodował, zanim znalazł się resetter prędkości. –

+0

Odpowiedź CaptainObvious jest prawdą. Nie jest określone w standardzie. Każdy sprzedawca urządzeń może to zrobić według własnego uznania. Zeruj pamięć natychmiast po przydzieleniu, co pozwoli Ci zaoszczędzić sporo kłopotów. –

Odpowiedz

9

No nie. Na przykład miałem to małe jądro test Dodaj atomową:

kernel void atomicAdd(volatile global int *result){ 
    atomic_add(&result[0], 1); 
} 

Nazywając to z tym kodem hosta (pyopencl + unittest):

def test_atomic_add(self): 
    NDRange = (4, 4) 
    result = np.zeros(1, dtype=np.int32)   
    out_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY, size=result.nbytes) 
    self.prog.atomicAdd(self.queue, NDRange, NDRange, out_buf) 
    cl.enqueue_copy(self.queue, result, out_buf).wait() 
    self.assertEqual(result, 16) 

był zawsze zwraca poprawną wartość podczas korzystania z mojego procesora. Jednak w ATI HD 5450 zwróconą wartością była zawsze śmieci.

I jeśli dobrze pamiętam, w NVIDIA pierwszy bieg zwrócił poprawną wartość, tj. 16, ale dla następnego uruchomienia wartości wynosiły 32, 48 itd. To było ponowne użycie tej samej lokalizacji ze starą wartością wciąż tam przechowywane.

Kiedy poprawił mój kod hosta z tej linii (kopiowanie wartości do bufora 0):

out_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY | self.mf.COPY_HOST_PTR, hostbuf=result) 

wszystko działało dobrze na dowolnych urządzeniach.

1

O ile wiem, nie ma w standardzie zdanie stwierdza, że ​​to. Może niektóre implementacje sterowników wykonają to automatycznie, ale nie można na nich polegać.

Pamiętam, że kiedyś miałem przypadek, gdy bufor nie została zainicjowana do 0, ale nie mogę zapamiętać ustawienia „OS + kierowca”.

Prawdopodobnie co się dzieje jest to, że typowy system operacyjny nie używa nawet 1% od teraz pamięci urządzenia dni. Więc kiedy uruchamiasz OpenCL, istnieje duże prawdopodobieństwo, że wpadniesz w pustą strefę.

+0

Interesujące uzasadnienie odpowiedzi. Jednak pamięć jest często inicjalizowana do 0 również na procesorze. –

+0

Pamięć często nie jest inicjowana, z wyjątkiem trybu debugowania. Jeśli jednak uruchomisz dowolny system, cała pamięć będzie wynosić zero. A jeśli nie zostanie użyty, pozostanie tak. I o ile wiem, pamięć GPU jest rzadko używana. – DarkZeros

Powiązane problemy