2014-03-24 17 views
0

我一直有麻煩從單個字符轉換爲整數,而在我的CUDA程序的主機功能。行後 -炭爲int在主機裝置與轉換CUDA

token[j] = token[j] * 10 + (buf[i] - '0'); 

我使用CUDA-GDB檢查令牌[J]值,我總是不似乎有一個模式不同的數字。我也嘗試過簡單的轉換,而不是乘以10(我在另一個線程中看到),不減去'0',而且我似乎總是得到不同的結果。任何幫助,將不勝感激。這是我第一次發佈堆棧溢出,如果我的格式很糟糕,請給我一個休息時間。

-A傢伙掙扎編碼器

__global__ void rread(unsigned int *table, char *buf, int *threadbytes, unsigned int *token) { 
     int i = 0; 
     int j = 0; 
     *token = NULL; 
     int tid = threadIdx.x; 
     unsigned int key; 
     char delim = ' '; 
     for(i = tid * *threadbytes; i <(tid * *threadbytes) + *threadbytes ; i++) 
     { 
       if (buf[i] != delim) { //check if its not a delim 
         token[j] = token[j] * 10 + (buf[i] - '0'); 
+0

BUF [I] - 「0」只會直到9,那麼你獲得工作的垃圾爲數字字符。我也看不出那是什麼* 10 –

+0

的字符在這種情況下,BUF [I],將永遠是一個單一的數字位數,這意味着0-9。 * 10並不重要,即使我擺脫了這一點,我仍然得到不同的結果。 – DanGordon

+0

如果我改變的代碼: 令牌[J] =(BUF [Ⅰ] - '0'); 我仍然有同樣的問題。即使在gdb,當我輸入: p BUF [I] - 「0」 我得到正確的數量,但一些與 – DanGordon

回答

1

有上寫令牌的競爭條件。

如果你想有每塊可以使用共享內存的本地陣列。如果你想爲每個線程使用一個本地數組,你將需要使用本地每線程內存並在棧上聲明數組。在第一種情況下,您還必須處理塊內部的併發性。在後者中,您不必這樣做,儘管您可能會浪費更多內存(並減少協作)。

+0

非常感謝!種族條件肯定發生。我只是在設備內部創建了一個數組。由於該數組只有5個字節,所以在每個線程中都沒有自己的令牌變量存在問題。 – DanGordon

+0

如果只有5個字節我相信它沒關係,如果每個線程都有自己的數據準備就緒。如果本地內存可以裝入寄存器而不會造成太多溢出,則本地內存很快。 –