2011-09-05 214 views
1

我知道在內核中只有調用__device__函數的限制。這可以防止我在內核中調用標準函數,如strcmp()等。
在這一點上,我無法理解/找到原因。在內核中內聯調用strcmp()的時候,編譯器是不是隻能跟在strings.h等內部?我想我尋找的原因很簡單,我在這裏錯過了一些東西。
它是重新實現我在內核計算中需要的所有函數和數據類型的唯一方法嗎?有這樣的重新實現的代碼庫嗎?CUDA:在內核中調用庫函數

+2

如果您覺得您需要在CUDA內核中使用C庫函數,那麼您可能*錯過了GPGPU編程的要點。 –

+2

'strcmp()'是一個簡單的函數。當然你可以爲你的目的寫一個等價物。 – stardt

+1

'strcmp()'的示例代碼可在http://en.wikipedia.org/wiki/Strcmp – stardt

回答

3

是的,從內核使用stdlib函數的唯一方法是重新實現它們。但我強烈建議你重新考慮這個想法,因爲它是高度不太可能你需要運行在GPU上使用strcmp()的代碼。請添加有關您的問題的更多詳細信息,以便提出更好的解決方案(我非常懷疑在GPU上串行字符串比較是您真正需要的)。

這是幾乎不可能簡單地重新編譯所有STDLIB的GPU,因爲它在很大程度上取決於某些系統調用(如內存分配),這可能不是GPU使用(當然,在最新版本的CUDA工具包你可以的從內核中分配設備內存,但它不是「cuda-way」,僅由最新的硬件支持,並且對性能不利()。 此外,大多數功能的CPU版本對於GPU來說遠非「好」。因此,絕大多數情況下,編譯GPU的普通CPU功能都不會導致問題,所以編譯器甚至不會嘗試它。

+1

這是一個普遍的問題,因爲我需要在我最近的CUDA項目中使用一個或兩個標準函數。目前我嘗試在GPU上創建字典,因此我至少需要一個strcpy() – Callahan

+1

@Callahan有一些STL移植到CUDA的推文庫,但它沒有字符串處理能力, GPUish任務。在每個線程中使用具有不同迭代次數的循環對性能不利。散列查找(int32或int64比較)更好,並且可以在CPU上使用相同散列的字符串中執行'strcmp()'。它還可以節省設備內存。 – aland

+0

這確實是一個好主意。只要我只想查找單詞......這將節省大量的內存!但是,如何計算一個小於2^64的長(15個字)單詞的不可信的散列? – Callahan

2

標準功能如strcmp()尚未針對CUDA架構進行編譯。我還沒有看到CUDA的任何標準C庫。