2

我有具有被此刻運行順序3種主要功能的應用程序:CPU和GPU的操作並行

1)加載數據到存儲器,並執行預處理的就可以了。

2)使用帶有theano的GPU對數據執行一些計算。

3)監視GPU上的計算狀態並將它們打印到屏幕上。

這3個功能通過使用多線程是令人尷尬的可並行化。但在Python中,我依次執行所有這三個功能。部分原因是因爲在過去,我對Python多線程和GIL問題有些不幸。

在這種情況下,我不一定需要利用多CPU的全部功能。所有我想要做的是,加載數據和預處理他們,而在GPU的計算進行,並在同一時間監測計算的狀態。目前大多數耗時的計算是在2)中執行的,所以我在2)的操作上有時間限制。現在我的問題是:

* python可以並行化這3個操作而不會產生新的瓶頸,例如:由於GIL問題。

*我應該使用多處理器的多線程,而不是?

簡而言之,如果我應該在Python中應該如何並行化這三個操作。

自從我上次編寫CPU的多線程代碼(尤其是python)以來已經有一段時間了,任何指導都將不勝感激。

編輯:錯別字。

+0

http://nvidianews.nvidia.com/Releases/GPU-Accelerated-Computing-Reaches-Next-Generation-of-Programmers-With-Python-Support-of-NVIDIA-CUDA-950.aspx –

+0

你解決了嗎?這個問題?我面對完全相同的問題,除了我的情況,最昂貴的一步是「加載數據」。如果你有一些解決方案,我會很感激你發佈它。 –

回答

2

的GIL是有點有時令人討厭的...

很多它會圍繞你如何使用GPU。請問您使用API​​允許你設置爲運行然後熄滅,做別的事情,偶爾投票,看看是否GPU已經完成?或者,也許它可以引發一個事件,調用回調或類似的東西?

我感覺你的問題答案是否定的......在這種情況下,我懷疑你唯一的選擇(假設你使用Python)是多處理。如果答案是肯定的,那麼你可以開始關閉GPU,然後得到一些預處理並在此期間繪製,然後檢查,看看是否GPU已經完成。

我不太瞭解Python或它如何進行多處理,但我懷疑它涉及在進程之間發送的數據的序列化和複製。如果你正在處理的數據量很大(我建議你擔心百兆大關,儘管這只是一種預感),那麼你可能想考慮在串行化和複製這些數據時會浪費多少時間。如果你不喜歡這種分析的答案,那麼就使用Python而言,你可能會失敗。

你說,食用部分時間最多的是GPU處理?據推測,其他兩部分是相當長的,否則試圖平行他們會有點點。例如,如果GPU是95%的運行時間,那麼通過並行處理來節省5%似乎是不值得的。

+0

是的你是對的,我正在使用的框架不支持輪詢以查看GPU是否已經完成(但他們告訴我他們計劃在將來提供支持,這在他們的議程中)。似乎多處理對我來說是最好的選擇。 – systemsfault

+0

祝你好運:)希望它會爲你工作。 – bazza