2013-05-13 32 views
0

我用x & y用於計算設備中矩陣的單元。 當我使用lenA & lenB超過32時,斷點(在設備代碼中的int x= threadIdx.x;)不能工作,輸出不正確。塊中的線程數

在主機代碼:

int lenA=52; 
int lenB=52; 

dim3 threadsPerBlock(lenA, lenB); 
dim3 numBlocks(lenA/threadsPerBlock.x, lenB/threadsPerBlock.y); 

kernel_matrix<<<numBlocks,threadsPerBlock>>>(dev_A, dev_B); 

在設備代碼:

int x= threadIdx.x; 
int y= threadIdx.y; 
... 
+0

你忘了問一個問題...... – talonmies 2013-05-13 19:24:37

+0

爲什麼lenA或lenB斷點超過32個值無法正常工作,程序的答案是錯誤的,但是小於32的話一切正常?我是否需要一種不同的方法來初始化x&y? – mahdimb 2013-05-13 19:32:42

+0

這應該寫入您的問題,而不是作爲評論下降。請記住,這個問題和答案同樣存在於下一個與你的幫助相同的問題。 – talonmies 2013-05-14 05:52:02

回答

1

threadsPerBlock爲dim3變量必須satisfy the requirements for the compute capability您靶向。

CC 1.x設備可處理多達每塊

CC 2.0 512個線程 - 3.5設備可以處理高達每塊1024個線程。

(32,32)處的dim3變量指定每塊1024(= 32x32)個線程。當你超過你的內核啓動失敗。

如果您在內核啓動時執行了cuda error checking,則會看到該錯誤。

由於內核實際上並沒有啓動這種類型的錯誤,所以在內核代碼中設置的任何斷點也不會被命中。

+0

謝謝,我只能使用前32個線程,如何使用x和y訪問32個線程? – mahdimb 2013-05-13 19:45:00

+1

您處理其他線程塊中的那些元素。每個線程塊處理1024個數據元素,可能是一個32x32塊或64x16塊,或者你喜歡的任何數字,這樣總數不會超過1024.如果你只是想訪問某些數據數組中的其他元素,使用普通的索引。 – 2013-05-13 19:50:17