2011-04-11 42 views
6

我的程序運行2個線程 - 線程A(用於輸入)和B(用於處理)。我還有一對指向2個緩衝區的指針,以便當線程A完成將數據複製到緩衝區1時,線程B開始處理緩衝區1,線程A開始將數據複製到緩衝區2中。然後,當緩衝區2滿時,線程A會複製數據輸入緩衝區1和線程B處理緩衝區2,等等。cudaMemcpy無效的參數

當我嘗試將cudaMemcpy Buffer []放入d_Buffer(之前由主線程cudaMalloc'd,即線程創建之前的Buffer []也被主線程malloc'd)時,我的問題就出現了。我得到一個「無效參數」的錯誤,但不知道哪一個是無效的參數。

我已經將我的程序減少到單線程程序,但仍使用2個緩衝區。也就是說,複製和處理一個接一個地發生,而不是同時發生。 cudaMemcpy行與雙線程完全相同。單線程程序正常工作。

我不確定錯誤在哪裏。

謝謝。

問候, 雷恩

回答

5

如果您正在使用CUDA 3.2這樣或更早,其原因就在於GPU上下文綁定到特定線程。如果一個多線程程序在不同的主機線程的同一GPU上分配內存,那麼分配會建立不同的上下文,而來自一個上下文的指針不能移植到另一個上下文中。每個上下文都有自己的「虛擬化」內存空間可供使用。

解決方案是使用上下文遷移API將單個上下文從線程傳輸到線程,或者嘗試新的公共CUDA 4.0rc2版本,該版本應該支持您在不使用的情況下嘗試執行的操作上下文遷移。缺點是4.0rc2是一個測試版本,它需要一個特定的beta版本驅動程序。該驅動程序將無法正常工作(例如筆記本電腦)。

+0

謝謝!我發現cuCtxPushCurrent和cuCtxPopCurrent,它們是驅動程序API。是否有用於上下文遷移的運行時API?我可以將運行時API和驅動程序API混合到同一個程序中嗎? – Rayne 2011-04-11 07:30:31

+0

沒有運行時API上下文管理例程,因爲上下文在運行時API中被隱式/抽象掉了。但是,自CUDA 3.1發佈以來,可以安全地混合運行時API和驅動程序API調用。您可能會發現使用驅動程序API創建上下文並將其從一個線程遷移到另一個線程是最容易的,在上下文中使用運行時API執行其餘操作。請注意,上下文遷移本身並不是免費的,它確實會增加一點延遲,但它是官方的方式來做你想要的CUDA 4.0之前的版本 – talonmies 2011-04-11 07:45:48

+0

我想試用CUDA 4.0。我是否簡單地將CUDA 4.0安裝在當前安裝的CUDA 3.2上?我是否需要刪除任何內容司機等? – Rayne 2011-04-12 03:10:01