天天看點

CUDA學習(九十六)

一緻性和并發性:

在計算能力低于6.x的裝置上同時通路托管記憶體是不可能的,因為如果CPU在GPU核心處于活動狀态時通路統一記憶體配置設定,則無法保證一緻性。 但是,支援作業系統的計算能力6.x裝置允許CPU和GPU通過新的頁面錯誤機制同時通路統一記憶體配置設定。 程式可以通過檢查新的concurrentManagedAccess屬性來查詢裝置是否支援對托管記憶體的并發通路。 請注意,與任何并行應用程式一樣,開發人員需要確定正确的同步以避免處理器之間的資料危害。

GPU獨占通路管理記憶體:

為了確定6.x之前的GPU架構的一緻性,Unified Memory程式設計模型在資料通路方面存在限制條件,而CPU和GPU同時執行。 實際上,在任何核心操作正在執行時,GPU都可獨占通路所有受管資料,而不管特定核心是否正在使用該資料。 當托管資料與cudaMemcpy ()或cudaMemset ()一起使用時,系統可能會選擇從主機或裝置通路源或目标,這會限制并發CPU通路該資料,而cudaMemcpy () 或cudaMemset ()正在執行。 有關更多詳細資訊,請參閱使用托管記憶體的Memcpy()/ Memset()行為。

當GPU對于concurrentManagedAccess屬性設定為0的裝置處于活動狀态時,不允許CPU通路任何托管配置設定或變量。在這些系統上,并發CPU / GPU通路(即使對于不同的托管記憶體配置設定)也會導緻分段錯誤,因為 該頁面被認為是CPU無法通路的頁面。

在上面的例子中,GPU程式核心在CPU觸摸y時仍處于活動狀态。 (請注意它在cudaDeviceSynchronize()之前是如何發生的。)由于GPU頁面錯誤功能,代碼在計算能力6.x的裝置上成功運作,這提升了對同時通路的所有限制。 但是,即使CPU正在通路與GPU不同的資料,這種記憶體通路在6.x之前的體系結構中也是無效的。 在通路y之前,程式必須顯式地與GPU同步:

如本例所示,在具有6.x GPU前體系結構的系統上,不管GPU核心是否實際觸及相同的資料,CPU線程都可能無法通路執行核心啟動和後續同步調用之間的任何托管資料(或 任何管理資料)。 并發CPU和GPU通路的可能性足以滿足程序級異常的發生。

CUDA學習(九十六)

繼續閱讀