2017-04-15 51 views
-2

由於整個代碼是漫長而雜亂的方式來顯示在這裏,我只想知道是否有人得到類似的錯誤。我顯示這些代碼片段:在cuda中的隨機線程混淆數組

在CUDA內核

// ismember is completely NaN at this point and pregpu full of double data 
// i is the threadID, these count var just some int to navigate through 1 d array 
ismember[i * countxyz] = indiceX; 
ismember[i * countxyz + 3 * (countx)] = indiceY; 
ismember[i * countxyz + 3 * (countx+county)] = indiceZ; 

// Output for debug 
// here I pretty much return the data from pregpu. 
if(i!=20) { 
     return; 
}else{ 
    for(int j = 0 ; j < countx; j++) { 
     iout[j] = pregpu[i*(countx+county+countz)+j+(i*2)];  
    }   
} 

我的輸出看起來像這樣:

DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA ISMEMBER for like no reason 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 
DATA PREGPU 

我估計有100 k個線程和我得到這個錯誤30次。每次運行錯誤都在相同的線程中,並且有相同的錯誤值。我從來不會在代碼的另一部分調用ismember或iout,所以我100%確定調用ismember [x] = y因爲沒有理由設置了pregpu [x] = y。如果我單獨運行線程,它的工作原理就是計算正確,只是多線程正在製造麻煩。

我希望知道是否有人遇到類似的問題,因爲我正在用盡思路,我做錯了什麼。哪有像有些內核,使他們的數據或從數組A的內核的出界的情況下陷入混亂問題存取權限陣列B.

我發起的數據,如:

__global__ void trav(double *tout, 
          double *iout, 
          double *ismember, 
          double *pregpu, 
          double *concatenategpu, 
          [some another unimportant var] 
         ) 
+1

一個詞 - [MCVE]。如果你不能提供這些信息,我就不會理解某人如何能夠理解這裏可能存在的問題。 – talonmies

+0

很抱歉,如果我無法提供幫助網站中提到的代碼,但由於我在提出一個普遍問題,我試圖讓代碼儘可能短,因爲它可以反映出問題。 – Jeahinator

+0

我對堆棧溢出相當陌生,所以如果你想更具體一些你想在代碼中看到的東西,我會非常感激。 – Jeahinator

回答

-2

所以我通過改變賦給函數的var的順序來發現錯誤。

被賦予該函數的數組是短的,所以超出邊界的索引會遇到給定的數組旁邊的數組。

我只得到Cuda超出範圍,如果沒有數組在後面短一個..