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?
Odpowiedz
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.
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ę.
Interesujące uzasadnienie odpowiedzi. Jednak pamięć jest często inicjalizowana do 0 również na procesorze. –
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
- 1. Unikalność urządzenia OpenCL
- 2. Używanie przypiętej pamięci/zmapowanej pamięci w OpenCL
- 3. Maksymalne przydzielanie pamięci na procesorze OpenCL
- 4. Uszkodzenie pamięci za pomocą clEnqueueWriteBuffer - OpenCL
- 5. OpenCL: Spójność pamięci urządzenia/hosta dla zmiennych przekazywanych do jądra za pomocą CL_MEM_USE_HOST_PTR
- 6. Czy Android obsługuje OpenCL?
- 7. Pamięć w OpenCL
- 8. Czy opencl obsługuje zmienne boolean?
- 9. Czy opencl obsługuje wskaźniki funkcji?
- 10. Czy OpenCL AMD oferuje coś podobnego do GPUDirecta CUDA?
- 11. Czy blokady spinów zawsze wymagają zapory pamięci? Czy wirowanie na barierce pamięci jest drogie?
- 12. Rozmiar pamięci lokalnej OpenCL i liczba jednostek obliczeniowych
- 13. Wywołanie kernela OpenCL z innego kernela OpenCL
- 14. Czy brak dostępu do pamięci zawsze powoduje błędy magistrali?
- 15. Czy elementy tablicy argv zawsze są ciągłe w pamięci?
- 16. Czy większy rozmiar pamięci podręcznej zawsze prowadzi do poprawy wydajności?
- 17. CUDA: Alokacja pamięci urządzenia pakującego w C++
- 18. Cuda - kopia z pamięci globalnej urządzenia do pamięci tekstury
- 19. Bariery w OpenCL
- 20. Znajdowanie wycieków pamięci podczas testowania urządzenia iPhone
- 21. Wyszukaj programowo zewnętrzną ścieżkę urządzenia pamięci USB?
- 22. Jak uzyskać całkowity rozmiar pamięci RAM urządzenia?
- 23. OpenCL - wydajność OpenGL Interop
- 24. Czy istnieje dobre opakowanie openCL dla Ruby?
- 25. Czy typy wektorów OpenCL używają SIMD
- 26. Wykorzystanie pamięci pypy rośnie na zawsze?
- 27. Ile cykli opóźnień pamięci dla typu dostępu do pamięci w OpenCL/CUDA?
- 28. Inicjowanie nieostatniego pola
- 29. Inicjowanie tablicy char z mniejszymi String Dosłowne
- 30. Jak konstruować duże jądra OpenCL?
To chyba inicjowany do zera na komputerze PC, ponieważ często zawierają informacjami poufnymi. Na konsoli prawdopodobnie nie byłoby takiej troski. – Potatoswatter
Symulator mojego nosa eksplodował, zanim znalazł się resetter prędkości. –
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. –