2012-11-30 27 views
4

我創建類似CUDA的東西,但我看到的RAM VRAM該副本的內存是非常快的就像從RAM複製到自身。但從VRAM複製到RAM的速度比RAM到VRAM慢。爲什麼將內存從VRAM複製到RAM比RAM到VRAM慢? (OpenGL的)

順便說一句,我用glTexSubImage2D從RAM複製到VRAM和glGetTexImage複製從VRAM到RAM。

爲什麼?有沒有辦法提高它的性能,如將RAM複製到VRAM?

+0

什麼GPU和驅動程序是什麼? –

+0

@AxelGneiting GS7200我認爲312. –

+0

什麼是GS7200? –

回答

6

從GPU到CPU傳送數據一直是一個非常緩慢的操作。

A GPU -> CPU回讀引入了一個「同步點」,CPU必須等待GPU完成其計算。在此期間,CPU停止向GPU提供數據,導致其停頓。

現在,請記住,一個現代的GPU在任何給定時刻在設計高度並行的方式,與在飛行中千個線程。同步點必須等待所有這些線程完成處理,然後才能回讀其計算結果。一旦回讀完成,所有這些線程必須從零開始執行......壞!

異步(幾幀之後)回讀的結果,允許GPU繼續執行其不捱餓線程(上文所述的停止和恢復的問題)。這極大地提高了性能 - GPU越平行,性能改進越高。

根據您的圖形芯片和驅動程序,使用PBOs可能會獲得更好的性能。

+0

但是,RAM到VRAM速度很快。 (1600萬浮點數在50ms以內,但另一個大約是500ms)順便說一句,我需要紋理,因爲我使用着色器來修改它們 –

+0

@FijiWiji是的,它超快,但另一個方向超慢。我會說500毫秒其他方式很快。 –

+0

@FijiWiji那麼,我回答你的問題,爲什麼它很慢。如果你的結果是紋理修改的,你可以通過使用離屏緩衝區來加快速度。 –

3

順便說一下,我使用glTexSubImage2D從RAM複製到VRAM和glGetTexImage從VRAM複製到RAM。

然後你不是複製數據。您正在執行pixel transfer operations,可能需要修改CPU,具體取決於您的image's internal format,像素傳輸格式和像素傳輸類型參數。

既然你沒有提供實際的代碼,也沒有辦法知道,如果你選擇不好的參數或沒有。

如果你想測試直接複製性能,使用buffer object

+0

嗯,像素傳輸操作被定義爲從GPU <-> CPU複製內存,甚至在您鏈接的頁面中聲明。 – CoffeeandCode