2010-05-20 50 views
0

我有一個奇怪的問題..我寫了一個在仿真中正確執行的CUDA代碼,並且所有結果都顯示出來了..但是,當在硬件「G210」上執行時..結果內存中的結果始終爲0硬件中的Cuda程序結果始終爲零,在EMU中正確嗎?

我將兩個向量傳遞給內核,一個使用隨機變量,另一個初始化爲零,代碼將第一個向量複製到共享內存,執行一些交換和其他操作,然後將結果寫回第二個向量(一個與初始的0)

我使用雙精度,則使用-arch SM13標誌,所有的存儲器分配也使用sizeof(雙)..

我已檢查內核是否被調用,它確實..所以這裏沒有問題.. cudaMemCpy沒有問題..

可能是什麼問題.. :(爲什麼它會在模擬工作,但不是HW

我很困惑..任何想法?

+0

你是否分析了代碼?從簡短的描述來看,您的操作聽起來像是內存綁定(主要是讀寫),所以值得檢查一下您沒有低效的內存事務或共享內存組衝突(如果您使用的是共享內存)。也許在其他問題或NVIDIA論壇上發佈更多細節。也有可能這是一個很好的候選人(http://code.google.com/p/thrust/)。 – Tom 2010-05-26 15:37:15

回答

2

如果我沒有記錯,GeForce 210不支持Compute Capability 1.3,即不支持雙打。

嘗試重寫您的代碼以使用單數,使用-arch = sm_12進行編譯。

+0

你是對的!我的錯誤..我剛剛這樣做,它正常運行正確的結果..謝謝加載..但是,沒有加快收益..相反,GPU是更慢:( – 2010-05-21 12:31:47

1

仿真模式不是GPU的精確模擬 - 它不會嘗試模擬併發線程的行爲以及由此產生的所有問題。爲了調試你的內核,你可能不得不把它分解成更小的版本,直到你能夠確定問題。

1

仿真使用不同的編譯器,所有內存位於主機上,只有一個線程正在運行等。如果您在仿真中發現錯誤,則在代碼中發現了一個錯誤。如果它在仿真中起作用,那並不意味着你沒有錯誤。你的問題基本上是,我有錯誤代碼,我的錯誤是什麼?

建議:檢查所有內容的返回值。瞭解如何進行錯誤檢查。意識到設備上的錯誤可能會針對cpu代碼異步顯示。使用調試器(也許購買便宜的低端nvidia gpu使這更容易)。如果你喜歡printf來調試,可以嘗試cuprintf(可在cuda論壇上找到)。在nvidia cuda論壇上尋求幫助。